力扣hot100:153. 寻找旋转排序数组中的最小值(二分的理解)

b9554e68da5e4cf2a5b41956e76cc017.png

        由力扣hot100:33. 搜索旋转排序数组(二分的理解)-CSDN博客,我们知道二分实际上就是找到一个策略将区间“均分”。对于旋转数组问题,在任何位置分开两个区间,如果原区间不是顺序的,分开后必然有一个区间是顺序的,一个区间是非顺序的,我们知道最小值必然是在非顺序的区间里。因此我们这里二分,目的是让区间变小使得答案在[left,right]区间里。我们需要特别注意二分中的边界条件,比如下面考虑到的,整个区间是顺序的,以及如何精确的找到非顺序区间的答案区间。

        当nums[left]>nums[mid]时,顺序的区间一定是[mid+1,right],而不是[mid,right],因此我们是right=mid,而不是right=mid-1!并且right=mid算不算二分? 实际上也是算的!只不过你可以发现问题就出现在当元素只有一个时仅仅将{left=mid,right=mid}会导致死循环,两个元素是right=mid仍然可以减小区间。然而我们这里在只有一个元素时,是可以找到答案的,因此这里仅仅right=mid也是一个可以做到二分的方法。

class Solution {
public:
    int findMin(vector<int>& nums) {//答案一定在非顺序区间里
        int left=0,right=nums.size()-1;
        while(left<=right){
            int mid=(left+right)>>1;
            if(nums[left]<=nums[mid]){//左边是顺序的
                if(nums[mid]<=nums[right]){//右边也是顺序的,说明整个区间是顺序的
                    return nums[left];
                }else{//右边不是顺序的,答案在右边哦,由于[left,mid]必定是整个区间顺序,mid必然不是答案,因此答案必然在[mid+1,right]
                    left=mid+1;
                }
            }else{//左边不是顺序的,右边[mid+1,right]一定是顺序的,因此答案必然在[left,mid]中
                right=mid;
            }
        }
        return 0;
    }
};

 

 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 18:44:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 18:44:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 18:44:02       82 阅读
  4. Python语言-面向对象

    2024-03-21 18:44:02       91 阅读

热门阅读

  1. Python从入门到精通秘籍十

    2024-03-21 18:44:02       44 阅读
  2. 周记-week3-人脸识别

    2024-03-21 18:44:02       43 阅读
  3. 阿里云企业级 Kubernetes 部署方案详解

    2024-03-21 18:44:02       40 阅读
  4. 27-3 文件上传漏洞 - 文件类型绕过(后端绕过)

    2024-03-21 18:44:02       40 阅读
  5. set和map

    set和map

    2024-03-21 18:44:02      45 阅读
  6. 关于Grok-1

    2024-03-21 18:44:02       46 阅读
  7. C/C++蓝桥杯之报数游戏

    2024-03-21 18:44:02       39 阅读