代码改变世界

[LeetCode] 154. Find Minimum in Rotated Sorted Array II_Hard

2019-07-11 10:15  Johnson_强生仔仔  阅读(153)  评论(0编辑  收藏  举报

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.

Example 1:

Input: [1,3,5]
Output: 1

Example 2:

Input: [2,2,2,0,1]
Output: 0

Note:

这题是[LeetCode] 153. Find Minimum in Rotated Sorted Array_Medium tag: Binary Search的follow up,允许重复,但是如果重复数量太多,比如[2,2,2,2,2,2,2,0,2,2,2,2] 时间复杂度可能会上升到O(n), 而且二分法不再实用,所以直接用暴力破解就好。

Code

class Solution:
    def findMinRotate(self, nums):
        return min(nums)

 

Update on 07/31/2023, 还是用二分法,并且找first index <= nums[r] r init 为n - 1; 相当于要找到右边的递增的部分,edge case 为num == nums[r] , r -= 1, 如果是 num > nums[r],那肯定还在左边的递增部分,可以l = mid, elif num < nums[r], 表明已经在右边的递增部分,可以继续二分。

T: O(lgn), worst O(n)   S: O(1)

Code

class Solution:
    def findMin(self, nums: List[int]) -> int:
        l, r = 0, len(nums) - 1
        while l + 1 < r:
            mid = l + (r - l)//2
            num = nums[mid]
            if num > nums[r]:
                l = mid
            elif num < nums[r]:
                r = mid
            else:
                r -= 1
        return min(nums[l], nums[r])