思路:折半查找,把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