把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。
示例 1:
输入:[3,4,5,1,2]
输出:1
示例 2:
输入:[2,2,2,0,1]
输出:0
使用二分查找:
原本是一个排好序的数组,现分为两个排好序的数组,里面有个分隔点(也就是最大值),而最小值就在分隔点后面一位
定义 left right middle
如果 middle 的值比 right 小,说明从 middle 到 right 为止都是顺序,没有错乱,因此需要找的分隔点在 middle 左边,将 right 移到至 middle
如果 middle 的值比 right 大,说明从 left 到 middle 为止都是顺序,没有错乱,因此需要找的分隔点在 middle 右边,将 left 移到至 middle+1
如果 middle 的值等于 right,此时无法判断待查找的值是在左边还是右边,将 right--
另外还有一些细节需要注意:
为什么是 right = middle 而 left = middle+1
来自官解视频截图:本质是判断 middle 是否有可能为待查找值,如果没可能,就可以 +1 或者 -1
public class minarray {
public int minArray(int[] numbers) {
int left = 0;
int right = numbers.length-1;
while (left < right){
int middle = left + (right-left)/2;
if (numbers[middle] < numbers[right]){
right = middle;
}else if (numbers[middle] > numbers[right]){
left = middle+1;
}else {
right--;
}
}
return numbers[left];
}
}