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

文章介绍了两种方法来找到旋转数组中的最小数字。普通做法是通过遍历数组,寻找第一个大于其后元素的数,该数的下一个位置即为最小值。二分法思路则是利用旋转数组的特性,缩小搜索范围,当找到旋转点时确定最小值的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:

旋转数组的最小数字_牛客题霸_牛客网

题目描述:

普通做法思路:

非降序数组,也就是说前面都是小的数字,但是有一部分被拿到后面去了,我们依次遍历,前方未修改的地方肯定是 rotateArray[i]< rotateArray[i+1]的,向后遍历时第一个出现rotateArray[i]> rotateArray[i+1]的,此时rotateArray[i+1]就是最小值。

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
       if(rotateArray.size() == 0) return 0;
       int len = rotateArray.size();
        //依次遍历比较 把
       for(int i = 0; i < len-1; i++){ 
        if(rotateArray[i] > rotateArray[i+1]) return rotateArray[i+1];
       } 
       return rotateArray[0];
    }
};

二分法思路

  1. 如果该数组有一部分被旋转了,那么就不可能会有rotateArray[mid] < rotateArray[high],出现此情况只可能是该数组未被旋转,此时通过二分法继续遍历;
  2. rotateArray[mid] == rotateArray[high],例如12222, 12333这种情况一个一个的遍历
  3. rotateArray[mid] > rotateArray[high] 这里说明有旋转,最小值肯定被旋转到后面去了;
int minNumberInRotateArray(vector<int> rotateArray) {       
        if( rotateArray.size() == 0) return 0;
        int low = 0, high = rotateArray.size()-1;
        while(low + 1 < high){
            int mid = low + (high - low)/2;
            if(rotateArray[mid] < rotateArray[high]) high = mid;//说明右边有序,那就向左边走
            else if(rotateArray[mid] == rotateArray[high]) high = high-1;// 这种情况跟是特例只能一个一个的判断
            else
                low = mid;
        }

        return min(rotateArray[low], rotateArray[high]);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值