题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。
实现:
class Solution {
public int minArray(int[] numbers) {
int left = 0; //数组最左边的位置(即下标值)
int right = numbers.length - 1; //数组最右边的位置(即下标值)
while (left < right){ //当什么什么时候
int mid = (right-left)/2 + left; //确定中间位置的下标值
if(numbers[mid] < numbers[right]){ //如果中间那个位置的数小于最右边的数
right = mid;
//则让最右边的下标值变成中间位置的下标值
//假如这个数组是[3,4,5,1,2,2,2]
//然后循环第二遍,一直到数组里面只剩下一个元素的时候,这个while循环才会中止
//到那时这个数组的最小数也找到了
}else if(numbers[mid] > numbers[right]){
left = mid + 1;
}else{
right -= 1;
//当数组中剩下两个元素,但两个元素又都相同的时候,上面这两行代码就派上用场了
//具体思考方向可以这么想:假如数组中最后剩了两个3
}
}
return numbers[left];
}
}