Find Minimum in Rotated Sorted Array in DSA Python - Time & Space Complexity
We want to know how fast we can find the smallest number in a rotated sorted list.
How does the time needed grow as the list gets bigger?
Analyze the time complexity of the following code snippet.
def find_min(nums):
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
if nums[mid] > nums[right]:
left = mid + 1
else:
right = mid
return nums[left]
This code finds the smallest number by narrowing down the search using a middle point.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that halves the search range each time.
- How many times: About log n times, repeating until one element remains.
Each step cuts the search area in half, so the number of steps grows slowly as the list grows.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 4 steps |
| 100 | About 7 steps |
| 1000 | About 10 steps |
Pattern observation: Doubling the list size adds only one extra step.
Time Complexity: O(log n)
This means the time needed grows slowly, adding just a few more steps even if the list gets much bigger.
[X] Wrong: "The code checks every number, so it must be O(n)."
[OK] Correct: The code smartly skips half the list each time, so it does not check every number.
Understanding this method shows you can use smart searching to save time, a skill valued in many coding challenges.
"What if the list was not rotated but fully sorted? How would the time complexity change?"
Practice
[4, 5, 6, 7, 0, 1, 2]?Solution
Step 1: Understand the rotated sorted array
A rotated sorted array is originally sorted but then shifted. The smallest number is where the rotation happened.Step 2: Identify the minimum element
The minimum element is the smallest number, marking the rotation point.Final Answer:
To find the smallest number where the rotation happened -> Option AQuick Check:
Minimum = smallest number at rotation [OK]
- Looking for the largest number instead
- Trying to sort the array again
- Counting rotations instead of finding minimum
nums using binary search?Solution
Step 1: Understand binary search initialization
Binary search uses start at 0 and end at last index (length - 1).Step 2: Check each option
start, end = 0, len(nums) - 1 correctly sets start=0 and end=len(nums)-1. Others have invalid ranges.Final Answer:
start, end = 0, len(nums) - 1 -> Option CQuick Check:
Binary search range = start=0, end=length-1 [OK]
- Setting start or end outside valid index range
- Using length instead of length - 1 for end
- Starting from 1 instead of 0
def find_min(nums):
start, end = 0, len(nums) - 1
while start < end:
mid = (start + end) // 2
if nums[mid] > nums[end]:
start = mid + 1
else:
end = mid
return nums[start]
print(find_min([3, 4, 5, 1, 2]))Solution
Step 1: Trace the binary search steps
Initial array: [3,4,5,1,2], start=0, end=4 - mid=2, nums[mid]=5, nums[end]=2, 5>2 so start=mid+1=3 - now start=3, end=4 - mid=3, nums[mid]=1, nums[end]=2, 1<=2 so end=mid=3 - start=3, end=3, loop endsStep 2: Return minimum element
nums[start]=nums[3]=1 is the minimum.Final Answer:
1 -> Option DQuick Check:
Minimum found = 1 [OK]
- Returning nums[mid] instead of nums[start]
- Not updating start or end correctly
- Confusing > and < in condition
def find_min(nums):
start, end = 0, len(nums) - 1
while start <= end:
mid = (start + end) // 2
if nums[mid] > nums[end]:
start = mid + 1
else:
end = mid
return nums[start]Solution
Step 1: Analyze the loop condition
The loop uses start <= end, which can cause infinite loop or index errors because start can pass end.Step 2: Correct loop condition for binary search
Using start < end ensures the loop stops when start meets end, correctly locating minimum.Final Answer:
The loop condition should be start < end, not start <= end -> Option AQuick Check:
Loop condition must be start < end [OK]
- Using <= causes infinite loops or wrong indexes
- Changing mid calculation unnecessarily
- Comparing with wrong array element
[2, 2, 2, 0, 1, 2], which modification to the binary search approach helps correctly find the minimum?Solution
Step 1: Understand duplicates affect comparison
When nums[mid] equals nums[end], we cannot decide which side minimum is on because duplicates hide order.Step 2: Skip duplicate by reducing end
Reducing end by 1 removes one duplicate and narrows search without missing minimum.Final Answer:
When nums[mid] == nums[end], reduce end by 1 to skip duplicate -> Option BQuick Check:
Handle duplicates by shrinking end [OK]
- Assuming no duplicates and using normal binary search
- Sorting array first wastes time
- Returning first element without checking
Ready to prove it?
Pass the test and this pattern moves unknown
