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];
    }
}