[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:
- This is a follow up problem to Find Minimum in Rotated Sorted Array.
- Would allow duplicates affect the run-time complexity? How and why?
这题是[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])