#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param rotateArray int整型一维数组 
# @return int整型
#
class Solution:
    def minNumberInRotateArray(self , rotateArray: List[int]) -> int:
        # write code here
        # return min(rotateArray) 直接调用函数
        # 二分查找时间复杂度为O(logn)
        left = 0
        right = len(rotateArray) - 1
        if rotateArray[left] < rotateArray[right]: # 如果是排好序的数组,直接返回第一个值
            return rotateArray[left]
        while left < right:
            if right - left == 1:
                break
            mid = (left + right) // 2
            if rotateArray[left] == rotateArray[right] and rotateArray[left] == rotateArray[mid]:
                # 对应[1,0,1,1,1]和[1,1,1,0,1]无法判定中间元素是属于前数组还是后数组的时候,顺序查找
                return self.minInorder(rotateArray, left, right)
            if rotateArray[mid] >= rotateArray[left]: # 注意等于号,中间值在前递增数组,最小值在后半段
                left = mid
            elif rotateArray[mid] <= rotateArray[right]: # 注意等于号,中间值在后递增数组,最小值在前半段
                right = mid
        return rotateArray[right]
    def minInorder(self, array, left, right):
        result = array[left]
        for i in range(len(array)):
            if result > array[i]:
                result = array[i]
        return result