【leetcode】Array——Find Minimum in Rotated Sorted Array II(154)

題目:前一道題鏈接:http://blog.csdn.net/u013127687/article/details/50935939

Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

思路:同樣是判斷nums[mid]和nums[left] nums[right]之間的關係(自己的思路有點複雜)

代碼:

public int findMin(int[] nums) {
    int left=0;int right = nums.length-1;
    while(left<right){
    	if(left+1==right)
    		return nums[left]>nums[right]?nums[right]:nums[left];
    	int mid = left+((right-left)>>1);
    	if(nums[mid]<nums[mid-1])//找到轉折點,return
    		return nums[mid];
    	if(nums[mid]==nums[left]&&nums[mid]==nums[right])
    		//存在翻轉,但是確定mid和轉折點的位置關係,僅做left++處理
    		left++;
    	else if(nums[mid]>=nums[left]&&nums[mid]>nums[right]){
    		//存在翻轉,轉折點在mid右側
    		left=mid+1;
    	}else if(nums[mid]<nums[left]&&nums[mid]<=nums[right]){
    		//存在翻轉,轉折點在mid的左側
    		right=mid-1;
    	}else if(nums[mid]>=nums[left]&&nums[mid]<=nums[right]){
    		//left和right之間不存在翻轉,所以最小值是nums[left]
    		return nums[0];
    	}
    }
    //if not return in while,then left==right
	return nums[left];
}
思路2:leetcode上面給的解析思路更清晰

class Solution {
public:
    int findMin(vector<int> &num) {
        int lo = 0;
        int hi = num.size() - 1;
        int mid = 0;

        while(lo < hi) {
            mid = lo + (hi - lo) / 2;

            if (num[mid] > num[hi]) {
                lo = mid + 1;
            }
            else if (num[mid] < num[hi]) {
                hi = mid;
            }
            else { // when num[mid] and num[hi] are same
                hi--;
            }
        }
        return num[lo];
    }
};
鏈接:https://leetcode.com/discuss/19746/my-pretty-simple-code-to-solve-it


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章