(C++)剑指offer-6:旋转数组的最小数字

剑指offer-6:旋转数组的最小数字

再次使用了经典的二分思想(y总给跪了)
可以将测试样例泛化数组中的数在二维坐标系中表示,横坐标表示数组下标,纵坐标表示数值,如下所示:
在这里插入图片描述
通过二维坐标发现除了最后水平的一段(黑色水平那段)之外,其余部分满足二分性质:竖直虚线左边的数满足 nums[i]≥nums[0];而竖直虚线右边的数不满足这个条件,因此处理思路变得简单些:
1.将最后同nums[0]相同的数字段删除;
2.如果剩下最后一个数nums[i]大于等于第一个数nums[0],则数组整体单调;
3.对删除黑色水平段的数组进行二分遍历。

具体代码如下:

class Solution {
public:
    int minNumberInRotateArray(vector<int>& nums) {
        int n = nums.size() - 1;
        if(n <= 0) return -1;
        while(n > 0 && nums[n] == nums[0]) n--;
        if(nums[n] >= nums[0]) return nums[0];
        int l = 0, r = n;
        while(l < r){
            int mid = l + r >> 1;
            if(nums[mid] < nums[0]) r = mid; //opps
            else l = mid + 1;
        }
        return nums[r];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值