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

旋转数组的最小数字

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

1.offer书上的写法,坑点很多。

  • 3 4 5 1 2 (一般情况)
  • 1 2 3 4 5 / 2 2 2 2 2(容易想到的点)
  • 1 0 1 1 1 / 1 1 1 0 1(扑街)
public class Solution {
    public int minNumberInRotateArray(int[] array) {
        int i = 0, j = array.length - 1;
        if (array[i] < array[j]) { // 2
            return array[i];
        }
        if (array[i] == array[j] && array[i] == array[(i + j) >> 1]) { // 3
            int min = array[i];
            for (; i <= j; i++) {
                if (array[i] < min) {
                    min = array[i];
                }
            }
            return min;
        }
        while (i + 1 < j) { // 1
            int mid = (i + j) >> 1;
            if (array[mid] >= array[i]) {
                i = mid;
            } else if (array[mid] <= array[j]) {
                j = mid;
            }
        }
        return array[j];
    }
}

2.大佬的思路,orz~

public class Solution {
    public int minNumberInRotateArray(int[] array) {
        int i = 0, j = array.length - 1;
        while (i < j) {
            if (array[i] < array[j]) {
                return array[i];
            }
            int mid = (i + j) >> 1;
            if (array[mid] > array[i]) {
                i = mid + 1;
            } else if (array[mid] < array[j]) {
                j = mid; // 如果是mid-1,则可能会错过最小值,因为找的就是最小值
            } else i++;  // 巧妙避免了offer书上说的坑点(1 0 1 1 1)
        }
        return array[i];
    }
}
全部评论
第九行的 if (array[mid] > array[i]) { 应该改成 if (array[mid] > array[j]) {
2 回复 分享
发布于 2021-02-09 10:28
mid + 1就不会错过最小值吗
1 回复 分享
发布于 2020-07-22 19:27
我的思路 public int minNumberInRotateArray(int [] array) { Arrays.sort(array); return array[0]; } orz...hhhhhh
1 回复 分享
发布于 2020-04-02 21:32
兄弟递增这种情况应该是没有吧,题目上面要求的是非递减的数组的一个旋转,所以肯定不会是递增的数组
点赞 回复 分享
发布于 2020-09-04 14:55
(array[mid] < array[j])如果写成array[mid]
点赞 回复 分享
发布于 2020-05-14 18:10
我在二楼举得例子有问题,应该用{5,6,3,4,4}这个作为示例
点赞 回复 分享
发布于 2020-04-16 23:40
根据题意好像不会出现int i = 0, j = array.length - 1; while (i < j) { if (array[i] < array[j]) { return array[i]; } 这种情况吧,大哥能不能指点一下
点赞 回复 分享
发布于 2020-04-05 02:48
如果是[2,4,5,1,3],那岂不是第一次就返回了,而且返回的也不是最小数字
点赞 回复 分享
发布于 2020-03-16 11:58
回答下1楼的问题。{5,6,4,4,4} mid标识的是4,如果是mid-1就让边界变成了6,错过最小值4,所以j必须是mid标识的4
点赞 回复 分享
发布于 2020-03-15 12:06
   } elseif(array[mid] < array[j]) {                 j = mid; // 如果是mid-1,则可能会错过最小值,因为找的就是最小值             } elsei++; 大佬问一下为什么是j=mid而不是j=mid-1啊? 怎么个错过法?
点赞 回复 分享
发布于 2019-09-29 14:10

相关推荐

面了100年面试不知...:被割穿了才想起来捞人了
投递哔哩哔哩等公司6个岗位
点赞 评论 收藏
分享
评论
35
1
分享

创作者周榜

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