题目简介:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [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 { |