題目:前一道題鏈接: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