题目简介:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例 1:
1 | 输入:[3,4,5,1,2] |
示例 2:
1 | 输入:[2,2,2,0,1] |
思路:
摸鱼做法:直接sort,返回数组最小值即可。
二分做法:设最小值在数组的下标为min,将每次的numbers[mid]与numbers[right]比较,存在三种情况:
numbers[mid] < numbers[right],此时mid位于[min, right),所以将right = mid。numbers[mid] > numbers[right],此时mid位于[left, min),所以将left = mid + 1。numbers[mid] = numbers[right],此时无法判别mid位于最小值的左侧还是右侧,就像下面这个例子一样,numbers[mid] = numbers[right] = 1。所以将right--,缩小范围。1
[1, 1, 1, 0, 1, 1, 1]
最后返回numbers[left]即可。
tip:
- 用
numbers[right]作比较的原因通过与它的比较,能得出numbers[mid]在最小值的左侧还是右侧,而numbers[left]则不行。
代码如下:
1 | class Solution { |