题目:
剑指 Offer 11. 旋转数组的最小数字
思路:
暴力破解:
只要nums[i+1] < nums[i],那么num[i]就是最小的
二分法:
对于有序或局部有序的数组,可以考虑二分法。
1.因为是数组的旋转,所以一直和high位进行比较
2.mid > high:最小值肯定在右侧
3.< 肯定在左侧,但是不能high = mid -1,因为mid有可能是最小的,所以要多考虑临界元素
4.= 要考虑重复元素的情况,high–,如[3,3,3,3,3,3,3,0,3,3]
代码:
class Solution {
// [3,4,5,1,2]
public static int minArray(int[] numbers) {
int low = 0;
int high = numbers.length - 1;
while (low < high) {
int mid = (low + high) / 2;
if (numbers[mid] > numbers[high]) {
low = mid + 1;
} else if (numbers[mid] < numbers[high]) {
// 这里有可能mid是最小的,所以不能-1
high = mid;
} else {
// [3,3,3,3,3,3,3,0,3,3],使用与这种重复
high--;
}
}
return numbers[low];
}
}