剑指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是错的
2 回复 分享
发布于 2021-07-18 15:33
方法二不对吧,对于输入[2,3,1,2,2,2,2,2,2],输出为2,但答案应该是1.
2 回复 分享
发布于 2021-01-26 15:49
方法2是错的,牛客网的测试用例太少了 1,2,3,4,5 或者 1,0,1,1,1 都不行
3 回复 分享
发布于 2021-03-01 20:23
方法二需要考虑特殊情况:如本身就是排序的数组[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
抓住~b站刷了你好多视频呢
点赞 回复 分享
发布于 2020-09-02 09:40

相关推荐

06-20 21:22
已编辑
门头沟学院 Java
纯真的河老师在喝茶:答应了就跑啊,实习随便跑啊,别被pua了,md就是找个廉价劳动力,还平稳过度正式工,到时候跟你说没转正
点赞 评论 收藏
分享
陆续:不可思议 竟然没那就话 那就我来吧 :你是我在牛客见到的最美的女孩
点赞 评论 收藏
分享
评论
15
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务