题目
给出一个长度为n的旋转数组rotateArray,求数组中的最小值
旋转数组
:一个非降序数组[1,2,3,4,5],把开始的若干元素搬到末尾,例如[3,4,5,1,2]或者[4,5,1,2,3]
思路
通过二分查找实现:
设置left、right两个指针,初始值分别为0,len(rotateArray)-1
- 若
left=right
,返回rotateArray[left]
- 计算
mid=(left+right)//2
,令rotateArray[mid]
和rotateArray[right]
比较:
-①若rotateArray[mid]>rotateArray[right]
,例如[3,4,5,1,2],说明要找的元素还在mid右边
,并且一定不在mid
的位置,令left右移=mid+1
-②若rotateArray[mid]<rotateArray[right]
,例如[4,5,1,2,3],说明要找的元素在mid左边
,或者就在mid
的位置,令right左移=mid
-③若rotateArray[mid]=rotateArray[right]
,例如[2,2,2,1,2]或者[2,1,2,2,2],不能确定
要找的元素在mid左边还是右边,但一定不在数组边缘
(left或right),此时只能稍微缩短范围继续查找:令right-1
代码
class Solution:
def minNumberInRotateArray(self, rotateArray):
left = 0
right = len(rotateArray) - 1
while left < right:
mid = (left + right) // 2
if rotateArray[mid] > rotateArray[right]:
left = mid + 1
elif rotateArray[mid] < rotateArray[right]:
right = mid
else:
right -= 1
return rotateArray[left]