Leetcode.154.Find Minimum in Rotated Sorted Array II

  今天是03/01.说实话,我个人非常讨厌二分搜索的题目,原因在于变种的二分搜索总是要理清楚不同情况下的+1,-1

事实上我觉得我可能从来没有愿意去弄清楚,所以在处理这种题目的时候,我一般都很随缘。

描述:

  Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

  (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

  Find the minimum element.

  I.you can assume there is no duplicate

  II. what if there are duplicates ?

 

解答:

 

  上面关于这道典型的二分搜索的题目,在不重复的情况下,还是非常easy的。引入重复后,在每一次判断前检查一下left和right临近的值

是否不同,如果不同,则回到了不重复的情况,如果相同,则按照区间减小的方向++ 或者 -- 删除完重复值。值得注意的还有两点:

    1.外面的while 要求l<r-1,所以我们操作完l 和 r 之后检查一下是否可以直接跳出while。

    2.可能pivot就在重复值之间,在开始之前我们先把这种可能性去掉。

 

代码:

不重复情况下:

class Solution {
public:
    int findMin(vector<int>& nums) {
        
        int n = nums.size();
        int l(0),r(n-1);
        while(l<r-1){
            int mid = l + (r-l)/2;                               
            if(nums[mid]>nums[l] && nums[mid]>nums[r]){
                l = mid+1;
            }
            else r = mid;
        }
        return min(nums[l],nums[r]);
    }
};

 

出现重复情况下:

class Solution {
public:
    int findMin(vector<int>& nums) {
                
        int n = nums.size();
        int l(0),r(n-1);
        
        while(nums[r]==nums[l] && l < r-1) r--;
        
        while(l<r-1){
            
            while(nums[l+1]==nums[l]) l++;
            while(nums[r-1]==nums[r]) r--;
            
            if(r-l<2) break;
            
            int mid = l + (r-l)/2;
            if(nums[mid]>nums[l] && nums[mid]>nums[r]){
                l = mid+1;
            }
            else r = mid;
        }
        return min(nums[l],nums[r]);
    }
};

 


 

转载于:https://www.cnblogs.com/wzhzju/p/6486057.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值