首页 > 代码库 > Leetcode:find_minimum_in_rotated_sorted_array

Leetcode:find_minimum_in_rotated_sorted_array

一、     题目

给定一个排好序的数组,数组可能是单调递增,也可能有一个变换。

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2)

要求找出最小的数。

二、     分析

这道题正如题目所说的分来两种情况

1、         严格单调递增

2、         有一个拐点

  我们需要分情况处理,当然也可以不管这些直接遍历,即从头到尾扫描,找出最小的数;如果根据题意,我们需要考虑

1、         当严格单调时,由于是排好序的所以我们直接return 第一个元素即可;或者直接利用二分法查找也可以。

2、         当有拐点时,我们就可以二分查找快速找到最小值。

综上所诉,考虑两种情况可以提高效率,但是直接当做一种情况更好处理。而且都能通过。

 

class Solution {
public:
    int findMin(vector<int> &num) {
    	int min = num[0];
        for(int i=1;i<num.size();i++){
        	if(num[i]>num[i-1])
        		min = num[i];
        } 
        return min;
    }
};

class Solution {
public:
    int findMin(vector<int> &num) {
    	if(num.size()==0) return 0;
		int sta=0;
		int flag;
    	int end=num.size()-1;
    	while(sta<end){
    		flag = (sta+end)/2;
    		if(num[flag]<num[end])
    			end=flag;
    		else 
    			sta=flag+1;
    	}
        return num[sta];
    }
};

class Solution {
public:
    int findMin(vector<int> &num) {
    	int cou=num.size()-1;         //the numbers of num
    	if(num.size()==0) return 0;   //the num is null
    	if(num.size()==1) return num[0]; //num have a single number
		int mid=0;
		int sta=0;       //the start 
		int end=cou;     //the end 
		if(num[sta]<num[end]) {     //Monotonically increasing
			return num[0];
		}
		else {             //There are situations inflection point 
			while(sta<end){
				mid = (sta+end)/2;
				if(num[mid]<num[end])
    				end=mid;
    		    else 
    				sta=mid+1;
			}
			return num[end];
        }
    }
};


Leetcode:find_minimum_in_rotated_sorted_array