思路:折半查找,把right坐标值作为target,逐渐缩小最小数字的目标范围
注意: 1、基于旋转数组特性,一定要以right,而不是left作为target 2、数组中出现重复数字时,要先将其移动过相同数值范围,且只移动一个指针,否则可能会跳过最小值 3、最终最小数字在left、right中出现
class Solution:
def minNumberInRotateArray(self , rotateArray: List[int]) -> int:
# write code here
if len(rotateArray) == 0:
return -1
l = 0
r = len(rotateArray) - 1
while l + 1 < r:
while rotateArray[l] == rotateArray[r]: # 注意1、2
r -= 1
mid = (l + r) // 2
if rotateArray[mid] > rotateArray[r]:
l = mid
else:
r = mid
return min(rotateArray[l], rotateArray[r]) # 注意3