题解 | #旋转数组的最小数字#

旋转数组的最小数字

http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @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
全部评论

相关推荐

头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
程序员小白条:找的太晚,别人都是大三实习,然后大四秋招春招的,你大四下了才去实习,晚1年
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务