154. Find Minimum in Rotated Sorted Array II
思路:
这道题虽然是困难,但和昨天的每日一题没区别,可以用二分秒了。
同样是利用二分的二段性,因为有重复的元素,所以找旋转点的时候去掉重复的元素,恢复二段性,然后剩下的就和昨天的代码一样了。 这个二段性真的理解太好用了,强烈推荐好好看看。
代码:
class Solution {
public:
int findMin(vector<int>& nums) {
int n=nums.size();
int left=0,right=n-1;
while(left<right&&nums[left]==nums[right]){ //恢复二段性
right--;
}
if(nums[right]>nums[left]) return nums[0]; //如果旋转后数组不变,那么久直接返回第一个元素
while(left<right){ //二分寻找旋转点
int mid =(left+right)/2;
if(nums[mid]>=nums[0]) left=mid+1;
else right=mid;
}
return nums[right];
}
};