旋转数组的最小数字
1 题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例:
输入:[3,4,5,1,2]
输出:1
2 题目分析
这道题最直观的解法就是依次遍历数组,直到碰到下一个元素比当前元素小的值时,返回下一个元素;或者遍历完都没碰到,说明所有元素相同,返回第一个即可。
其实根据示例很容易发现,旋转后把数组划分为两部分,我们要找的元素就是第二部分的首元素。那么很容易想到二分查找方法,而二分查找有两个条件,我们来看一看:
-
顺序存储
-
元素有序
元素有序是因为我们查找时可以确定下一次判断时的left和right,这个题如何确定呢?很简单
- 如果numbers[mid] > numbers[right],说明中间元素位于第一部分,left更新为mid+1
- 如果numbers[mid]< numbers[right],说明中间元素位于第二部分了,right更新为mid(不减1是因为,mid有可能是要返回的结果)
- 如果相等,则说明有相同元素,可以缩小区间,进行right–操作。
3 代码
class Solution {
public int minArray(int[] numbers) {
int left = 0, right = numbers.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (numbers[mid] < numbers[right]) { // 中间元素位于右边的一部分
right = mid;
} else if (numbers[mid] > numbers[right]) { // 中间元素位于左边的一部分
left = mid + 1;
} else {
right--;
}
}
return numbers[left];
}
}