【剑指offer T11】旋转数组的最小数字

旋转数组的最小数字

http://www.nowcoder.com/questionTerminal/9f3231a991af4f55b95579b44b7a01ba

参考解答区“leetcold”的解答,进行图示分析

分析:二分查找变种,没有具体的值用来比较。那么用中间值和高低位进行比较,看处于递增还是递减序列,进行操作缩小范围。

  • 处于递增:low上移

  • 处于递减:high下移(如果是high-1,则可能会错过最小值,因为找的就是最小值)

  • 其余情况:low++缩小范围
    图片说明

  • 特殊情况:图片说明

代码:

int minNumberInRotateArray(vector<int> rotateArray) {
        if(rotateArray.empty())
            return 0;

        int low = 0;
        int high = rotateArray.size() - 1;
        int mid = 0;

        while(low < high){
            // 子数组是非递减的数组,10111
            if (rotateArray[low] < rotateArray[high]) 
                return rotateArray[low];
            mid = low + (high - low) / 2;
            if(rotateArray[mid] > rotateArray[low])
                low = mid + 1;
            else if(rotateArray[mid] < rotateArray[high])
                high = mid;
            else low++;
        }
        return rotateArray[low];
    }
全部评论
正确的,个人感觉比剑指 offer 书上的更巧妙一点
1 回复
分享
发布于 2021-07-20 23:10
讲解得十分精彩!!!友情提醒:最后一张图的low和mid1位置反了~
点赞 回复
分享
发布于 2019-08-21 09:06
联想
校招火热招聘中
官网直投
讲得很好
点赞 回复
分享
发布于 2020-02-09 22:53
如果是[2,4,5,1,3],那岂不是第一次就返回了,而且返回的也不是最小数字
点赞 回复
分享
发布于 2020-03-16 11:44
你好,我想请问一下那个A[mid] < A[high]这种情况位于递减数组是什么意思呢?8 1 2 3是递减吗?
点赞 回复
分享
发布于 2020-06-25 14:53
只有我傻到用排序嘛哈哈哈哈
点赞 回复
分享
发布于 2020-06-26 16:25
可是代码无法通过,为啥
点赞 回复
分享
发布于 2020-07-14 10:41
前后都是递增数组吧?
点赞 回复
分享
发布于 2020-09-04 10:25
不都是递增数组吗
点赞 回复
分享
发布于 2020-10-12 15:40
哥,你的代码错了
点赞 回复
分享
发布于 2021-03-15 21:21
low<=high
点赞 回复
分享
发布于 2021-04-20 12:18
代码是正确的,思路很好
点赞 回复
分享
发布于 2021-06-12 23:00
额,递减啥意思?哪来的递减
点赞 回复
分享
发布于 2021-06-16 16:22
代码不对
点赞 回复
分享
发布于 2021-07-24 15:23
这个代码貌似并没有解决特殊情况的操作啊?
点赞 回复
分享
发布于 2021-08-04 09:40

相关推荐

127 20 评论
分享
牛客网
牛客企业服务