Date and Time: Jul 19, 2024, 0:13 (EST)
Link: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/
Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example, the array nums = [0,1,2,4,5,6,7] might become:
-
[4,5,6,7,0,1,2] if it was rotated 4 times.
-
[0,1,2,4,5,6,7] if it was rotated 7 times.
Notice that rotating an array [a[0], a[1], a[2], ..., a[n-1]] 1 time results in the array [a[n-1], a[0], a[1], a[2], ..., a[n-2]].
Given the sorted rotated array nums of unique elements, return the minimum element of this array.
You must write an algorithm that runs in O(log n) time.
Example 1:
Input: nums = [3,4,5,1,2]
Output: 1
Explanation: The original array was [1,2,3,4,5] rotated 3 times.
Example 2:
Input: nums = [4,5,6,7,0,1,2]
Output: 0
Explanation: The original array was [0,1,2,4,5,6,7] and it was rotated 4 times.
Example 3:
Input: nums = [11,13,15,17]
Output: 11
Explanation: The original array was [11,13,15,17] and it was rotated 4 times.
-
n == nums.length -
1 <= n <= 5000 -
-5000 <= nums[i] <= 5000 -
All the integers of
numsare unique. -
numsis sorted and rotated between1andntimes.
In the base case, we first check if nums[l] < nums[r], if this is true that means this subarray between [l, r] is sorted, so we update res = min(res, nums[l]) (nums[l] can be the smallest).
If nums[l] !< nums[r], we find m to use binary search to see if nums[l] <= nums[m], which means we should look at [m+1: ], because the left-subarray is increasing, and the smallest element must exist in the right subarray, so we update l = m + 1.
Similarly, if nums[l] > nums[m] that means the smallest element is between [l, m], so we update r = m - 1 to look at the left-subarray only.
Base case 1: nums[l] < nums[r], this subarray is sorted, res = min(res, nums[l]).
Base case 2: if nums[l] <= nums[m]: l = m + 1. Else, r = m - 1.
class Solution:
def findMin(self, nums: List[int]) -> int:
# Base case 1: nums[l] < nums[r], this subarray is sorted, res = nums[l]
# Base case 2: if nums[l] <= nums[m]: l = m + 1. Else, r = m - 1
l, r = 0, len(nums)-1
res = float("inf")
while l <= r:
if nums[l] < nums[r]:
res = min(res, nums[l])
m = (l + r) // 2
if nums[l] <= nums[m]:
l = m + 1
else:
r = m - 1
res = min(res, nums[m])
return resTime Complexity:
Space Complexity: