把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
力扣官方和书上的解法一样,力扣的图比较形象,书上太啰嗦了
力扣官方:二分法
情况1:nums[mid] < nums[high],那么high = mid
情况2:nums[mid] > nums[high],那么low = mid + 1,这里加1是为了防止low high mid不动导致超时
情况3:nums[mid] == nums[high],那么随便 high-- 或者 low++ 都可以
public int minArray(int[] numbers) {
int begin = 0, end = numbers.length - 1;
while (begin < end) {
int mid = (begin + end) / 2;
if (numbers[mid] < numbers[end]) {
end = mid;
} else if (numbers[mid] > numbers[end]) {
begin = mid + 1;
} else {
end--;
}
}
return numbers[begin];
}