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