旋转数组的最小数字

|||
    mid
                mid
class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int left=0,right=rotateArray.size()-1;
        while(left<right){
            if(rotateArray[left]<rotateArray[right])
                return rotateArray[left];
            int mid=left+((right-left)>>1);
            //因为旋转数组是两端递增的子序列,左大右小,所以mid与右端点比较找最小,如最上边那个示意图
            //如果mid比右端点大则说明当前mid在较大的递增序列中,所以最小值在mid的右边
            //又因为mid在较大区间所以mid不可能为最小值,所以该区间不包含mid
            //如果mid比右端点小则说明当前mid在较小的等增序列中,所以最小值在mid的左边
            //又因为mid在较小区间所以mid可能为最小值,所以该区间包含mid
            //如果比右端点大则说明最小值在右边
            //如果与右端点相等无法判断最小值位于那边,因为不能确定那边是单调递增的
            if(rotateArray[mid]>rotateArray[right]){
                left=mid+1;
            }
            //比右端点小则在左边
            else if(rotateArray[mid<rotateArray[right]]){
                right=mid;
            }else{
                //相等的情况无法判断最小元素在哪一边,所以只能缩小区间
                right--;
            }
        }
        return rotateArray[left];
    }
};
思考?
是否可以和左端点比较,确认区间了?   不能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值