每天两道LeetCodeHard:(26)

143 阅读1分钟

154. Find Minimum in Rotated Sorted Array II

旋转数组它又来了

题干:

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e.,  [0,1,2,4,5,6,7] might become  [4,5,6,7,0,1,2]).

Find the minimum element.

The array may contain duplicates.

解释:

一个有序数组被旋转了,让找最小值,关键点是有重复

思考:

本质是考二分查找。如果没有重复,直接二分查找到最后收缩的位置就是最小值了,那么重复有啥影响呢?这里我们暂时想不到,所以我们先写一个不考虑重复的版本,看看有什么corner test.结果发现其实这个题关键是在如果mid和right是相等的时候,要right-1继续寻找,因为破坏了二分的条件,最后返回的是left。时间效率85

答案:

class Solution(object):
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        left,right=0,len(nums)-1
        while left<right:
            mid = left+(right-left)//2
            if nums[mid]>nums[right]:
                left = mid+1
            elif nums[mid]<nums[right]:
                right=mid
            else:
                right-=1
        return nums[left]

答案补充: