剑指offer-旋转数组中的最小数字-Java版

旋转数组的最小数字

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

写在前面

代码说明:代码的下载地址: https://github.com/WuNianLuoMeng/Coding
视频说明:第一次以这样的形式录视频,如果有哪里说的不对,还请各位及时指出,谢谢~

旋转数组的最小数字 视频链接

方法一:遍历数组,不断去更新保存最小值的变量。时间复杂度是O(n)

    public int minNumberInRotateArray(int [] array) {
        if (array.length == 0) {
            return 0;
        }
        int ans = array[0];
        for (int i = 1; i < array.length; i++) {
            ans = Math.min(ans, array[i]);
        }
        return ans;
    }

方法二:通过二分的方法,不断去更新存在于两个子数组(两个非递减排序子数组)中的下标。时间复杂度是O(log(n))

 public int minNumberInRotateArray(int[] array) {
        if (array.length == 0) {
            return 0;
        }
        int l = 0;
        int r = array.length - 1;
        while (l < r - 1) {
            int mid = (l + r) >> 1;
            if (array[mid] >= array[l]) {
                l = mid; /// 说明mid所在的位置是在第一个非递减子数组中
            } else if (array[mid] <= array[r]) {
                r = mid; /// 说明mid所在的位置是在第二个非递减子数组中
            }
        }
        return array[r];
    }
全部评论
方法二不对吧,对于输入[2,3,1,2,2,2,2,2,2],输出为2,但答案应该是1.
2 回复 分享
发布于 2021-01-26 15:49
方法2是错的
2 回复 分享
发布于 2021-07-18 15:33
方法2是错的,牛客网的测试用例太少了 1,2,3,4,5 或者 1,0,1,1,1 都不行
3 回复 分享
发布于 2021-03-01 20:23
抓住~b站刷了你好多视频呢
点赞 回复 分享
发布于 2020-09-02 09:40
方法二需要考虑特殊情况:如本身就是排序的数组[1,2,3,4,5]: // 头部元素大于尾部元素说明本身就是有序 if (array[p1] < array[p2]) { return array[p1]; } 或者最小值就是在位于第二个元素[1,0,1,1,1]: // p1后面一个比它小,说明p1+1即为最小值,不需要再循环 if (array[p1] > array[p1+1]) { return array[p1+1]; }
点赞 回复 分享
发布于 2021-09-18 14:38

相关推荐

11-14 16:13
已编辑
重庆科技大学 测试工程师
Amazarashi66:不进帖子我都知道🐮❤️网什么含金量
点赞 评论 收藏
分享
11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
评论
15
1
分享
牛客网
牛客企业服务