当前位置:   article > 正文

剑指Offer11 旋转数组的最小数字(C++)_剑指 offer 11. 旋转数组的最小数字 c++

剑指 offer 11. 旋转数组的最小数字 c++

其实很容易看出这是一道二分查找的题目,但是二分查找的背后还是有很多的坑

1、数组可以重复

2、我被坑了的地方,若干个元素旋转可以是0个元素!!也就是说数组可能压根没有旋转,就直接是递增的,这种这里其实就有一个坑,mid的值不能和left作比较,因为没有意义!!

[1,3,5]  此时num[mid]>num[left],但是数组的最小值在mid左边

[3,4,5,1,2] 同样num[mid]>num[left],但是此时数组最小值在mid右边

但不同的是如果right值比mid的值大,那么右半部分肯定是递增的,所以可以以此作为切入点

那么right值和mid值相等时候又该怎么处理呢?

实际上这里是更加需要注意的地方,比如[2,2,2,1,2],或者[2,1,2,2,2]这种情况下,num[right]=num[left],我们是无法判断最小值在mid左边或者右边,所以只能right--,二分法时间复杂度退化,最终算法如下:

  1. class Solution {
  2. public:
  3. int minArray(vector<int>& numbers) {
  4. int left = 0,right = numbers.size()-1;
  5. while(left<right){
  6. int mid = left + (right-left)/2;
  7. cout<<left<<right<<mid<<endl;
  8. if(numbers[mid]>numbers[right]){
  9. left = mid+1;
  10. }
  11. else if(numbers[mid]<numbers[right]){
  12. right = mid;
  13. }
  14. else{
  15. right--;
  16. }
  17. }
  18. return numbers[left];
  19. }
  20. };

这里其实还有一个值得注意的地方就是 为什么left要mid+1,然后right只能mid,因为当numbers[mid]<numbers[right]时说不定mid所在的位置就是最小值呢,所以right = mid

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

闽ICP备14008679号