当前位置:   article > 正文

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

力扣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也是一个可以做到二分的方法。

  1. class Solution {
  2. public:
  3. int findMin(vector<int>& nums) {//答案一定在非顺序区间里
  4. int left=0,right=nums.size()-1;
  5. while(left<=right){
  6. int mid=(left+right)>>1;
  7. if(nums[left]<=nums[mid]){//左边是顺序的
  8. if(nums[mid]<=nums[right]){//右边也是顺序的,说明整个区间是顺序的
  9. return nums[left];
  10. }else{//右边不是顺序的,答案在右边哦,由于[left,mid]必定是整个区间顺序,mid必然不是答案,因此答案必然在[mid+1,right]
  11. left=mid+1;
  12. }
  13. }else{//左边不是顺序的,右边[mid+1,right]一定是顺序的,因此答案必然在[left,mid]中
  14. right=mid;
  15. }
  16. }
  17. return 0;
  18. }
  19. };

 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号