Find Minimum in Rotated Sorted Array in DSA Go - Time & Space Complexity
We want to know how fast we can find the smallest number in a rotated sorted array.
How does the time needed change as the array gets bigger?
Analyze the time complexity of the following code snippet.
func findMin(nums []int) int {
left, right := 0, len(nums)-1
for left < right {
mid := left + (right-left)/2
if nums[mid] > nums[right] {
left = mid + 1
} else {
right = mid
}
}
return nums[left]
}
This code finds the minimum value by using a binary search approach on a rotated sorted array.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The loop that halves the search range each time.
- How many times: The loop runs until the search range is reduced to one element, about log base 2 of n times.
Each time the array size doubles, the number of steps increases by one.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 4 steps |
| 100 | About 7 steps |
| 1000 | About 10 steps |
Pattern observation: The steps grow slowly as input size grows, increasing by one each time the input doubles.
Time Complexity: O(log n)
This means the time to find the minimum grows slowly, adding only a few extra steps even if the array gets much bigger.
[X] Wrong: "The loop runs through every element, so it is O(n)."
[OK] Correct: The code cuts the search space in half each time, so it does not check every element one by one.
Understanding this time complexity shows you can use efficient search methods on special arrays, a skill often valued in problem solving.
"What if the array was not rotated but still sorted? How would the time complexity change?"
Practice
Solution
Step 1: Understand the rotated sorted array property
A rotated sorted array is sorted but rotated at some pivot point, causing a break in order.Step 2: Use binary search to find the break point
Binary search helps find the point where the order breaks, which is where the minimum element lies.Final Answer:
Use binary search to find the point where order breaks -> Option DQuick Check:
Binary search finds minimum efficiently [OK]
- Trying to sort the array again wastes time
- Using linear search ignores the sorted property
- Using extra space unnecessarily
nums?Solution
Step 1: Understand array indexing in Go
Arrays are zero-indexed, so start should be 0 and end should be last index (length - 1).Step 2: Check each option for correct initialization
start, end := 0, len(nums)-1 correctly sets start=0 and end=len(nums)-1, which is valid for binary search.Final Answer:
start, end := 0, len(nums)-1 -> Option BQuick Check:
Correct index range initialization [OK]
- Using length as end index causes out-of-range errors
- Starting at 1 misses the first element
- Negative start index is invalid
nums := []int{4,5,6,7,0,1,2}
start, end := 0, len(nums)-1
for start < end {
mid := (start + end) / 2
if nums[mid] > nums[end] {
start = mid + 1
} else {
end = mid
}
}
fmt.Println(nums[start])Solution
Step 1: Trace the binary search loop
Initial start=0, end=6. Mid=(0+6)/2=3, nums[3]=7 > nums[6]=2, so start=4.Step 2: Continue loop until start meets end
Now start=4, end=6. Mid=(4+6)/2=5, nums[5]=1 <= nums[6]=2, so end=5. Next mid=(4+5)/2=4, nums[4]=0 <= nums[5]=1, so end=4. Loop ends when start=4, end=4.Final Answer:
0 -> Option AQuick Check:
Minimum element found at index 4 is 0 [OK]
- Confusing mid calculation causing infinite loop
- Incorrectly updating start or end pointers
- Printing nums[end] instead of nums[start]
nums:
start, end := 0, len(nums)-1
for start <= end {
mid := (start + end) / 2
if nums[mid] > nums[end] {
start = mid
} else {
end = mid - 1
}
}
fmt.Println(nums[start])Solution
Step 1: Analyze loop condition and pointer updates
The loop uses start <= end which can cause infinite loop when start == end. Also, start = mid does not move start forward properly, and end = mid - 1 skips the mid element incorrectly.Step 2: Correct the loop and pointer updates
Loop should be start < end. When nums[mid] > nums[end], start = mid + 1 to move forward. Else, end = mid to include mid in next search.Final Answer:
All of the above -> Option AQuick Check:
Proper loop and pointer updates avoid infinite loops [OK]
- Using <= causes infinite loops
- Not moving start pointer forward correctly
- Skipping mid element by subtracting 1 from end
nums that may contain duplicates, which modification is needed in the binary search approach to find the minimum element?Solution
Step 1: Understand duplicates affect binary search
Duplicates can cause nums[mid] == nums[end], making it unclear which side to search.Step 2: Modify binary search to handle duplicates
When nums[mid] == nums[end], safely reduce end by 1 to skip duplicate without missing minimum.Final Answer:
If nums[mid] == nums[end], reduce end by 1 to skip duplicate -> Option CQuick Check:
Handle duplicates by shrinking search space carefully [OK]
- Ignoring duplicates causes wrong results
- Increasing start instead of reducing end misses minimum
- Sorting wastes time and is unnecessary
Ready to prove it?
Pass the test and this pattern moves unknown
