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];
}
}
京公网安备 11010502036488号