剑指Offer——旋转数组的最小数字

思路:采用二分查找,分这几种情况。
1. 保证旋转数组(a[low]>=a[high]),若不保证,则没有旋转,是单调递增的,直接输出第一个数;否则下面几种情况;
2. 只剩两个数,第二个肯定最小;
3. a[low]=a[mid]=a[high],如[1,1,1,0,1],最小值不好判断,只能挨个找,因为a[low]>=a[high],所以让low++;
4. a[mid]>=a[low],如[3,4,5,1,2],最小值在右边;
5. a[mid]<=a[high],如[4,1,2,3,4],最小值在左边。
class Solution {
public:
    int minNumberInRotateArray(vector<int> a) {
        int len = a.size();
        if(len==0)
            return 0;
        int l=0,r=len-1;
        while(a[l]>=a[r])
        {//保证是旋转数组
            if(r-l==1)
            {//如果只剩两个数字
                return a[r];
            }
            int mid = l+(r-l)/2;
            if(a[l]==a[r]&&a[l]==a[mid])
            {//例如[1,1,1,0,1],最小值不好判断,只能挨个找
                l--;
            }
            else if(a[mid]>=a[l])
            {//例如[3,4,5,1,2],最小值在右边
                l=mid;
            }
            else if(a[mid]<=a[r])
            {//例如[4,1,2,3,4],最小值在左边
                r=mid;
            }
        }
        return a[l];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值