题目:前一道题链接: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