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];
    }
};
posted @ 2021-04-09 16:01  Mrsdwang  阅读(40)  评论(0编辑  收藏  举报