Find Minimum in Rotated Sorted Array in DSA Java - 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 grow as the array gets bigger?
Analyze the time complexity of the following code snippet.
public int findMin(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[right]) {
left = mid + 1;
} else {
right = mid;
}
}
return nums[left];
}
This code finds the smallest number by using a smart search that cuts the search area in half each time.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that compares middle and right elements.
- How many times: The loop runs until the search space is reduced to one element, roughly halving each time.
Each step cuts the search area roughly in half, so the number of steps grows slowly as the array grows.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 4 steps |
| 100 | About 7 steps |
| 1000 | About 10 steps |
Pattern observation: Doubling the input size adds only one more step.
Time Complexity: O(log n)
This means the time needed grows slowly, adding just a few more steps even if the array gets much bigger.
[X] Wrong: "The loop runs through every element one by one, so it is O(n)."
[OK] Correct: The code cuts the search area in half each time, so it does not check every element.
Understanding this search method shows you can use smart ways to find answers quickly, a skill valued in many coding challenges.
"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
A rotated sorted array is a sorted array shifted at some pivot. The smallest element is the rotation point.Step 2: Identify the minimum element
The minimum element is the smallest value after the rotation, which is the point where the order breaks.Final Answer:
To find the smallest element after the rotation point -> Option BQuick Check:
Minimum element = smallest after rotation [OK]
- Confusing minimum with maximum element
- Trying to count rotations instead of finding minimum
- Assuming array is fully sorted without rotation
Solution
Step 1: Check method return type and parameters
The method should return an int (the minimum value) and accept an int array parameter.Step 2: Validate Java method syntax
public int findMin(int[] nums) {} uses 'public int findMin(int[] nums) {}' which is correct Java syntax for this method.Final Answer:
public int findMin(int[] nums) {} -> Option AQuick Check:
Correct method signature = public int findMin(int[] nums) {} [OK]
- Missing return type or using void incorrectly
- Incorrect parameter syntax
- Missing access modifier or static keyword incorrectly
int[] nums = {4,5,6,7,0,1,2};
System.out.println(findMin(nums));
public static int findMin(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[right]) {
left = mid + 1;
} else {
right = mid;
}
}
return nums[left];
}Solution
Step 1: Understand the binary search logic
The code uses binary search to find the minimum by comparing middle and right elements, narrowing the search space.Step 2: Trace the loop with given array
Array: [4,5,6,7,0,1,2] - mid=3 (value 7), 7 > 2, so left = mid+1 = 4 - left=4, right=6 - mid=5 (value 1), 1 <= 2, so right = mid = 5 - left=4, right=5 - mid=4 (value 0), 0 <= 1, so right = mid = 4 Loop ends when left == right == 4, nums[4] = 0.Final Answer:
0 -> Option DQuick Check:
Minimum element found = 0 [OK]
- Returning nums[mid] instead of nums[left]
- Confusing comparison direction in binary search
- Not updating left or right correctly
public static int findMin(int[] nums) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[right]) {
left = mid + 1;
} else {
right = mid;
}
}
return nums[left];
}Solution
Step 1: Analyze the loop condition
The loop uses 'left <= right', which can cause infinite loop or index errors because left can go beyond right.Step 2: Correct the loop condition
Changing the condition to 'left < right' ensures the loop stops when left meets right, correctly identifying the minimum index.Final Answer:
The loop condition should be 'left < right' instead of 'left <= right' -> Option CQuick Check:
Loop condition must be 'left < right' [OK]
- Using 'left <= right' causing infinite loops
- Incorrectly adjusting right pointer
- Returning wrong array element after loop
int[] nums = {2,2,2,0,1,2};Solution
Step 1: Understand the effect of duplicates
Duplicates can cause ambiguity when nums[mid] equals nums[right], making it unclear which side to search.Step 2: Modify binary search to handle duplicates
When nums[mid] == nums[right], reduce right by one to shrink search space safely without missing minimum.Final Answer:
Add a condition to reduce right by one when nums[mid] equals nums[right] -> Option AQuick Check:
Handle duplicates by shrinking right pointer [OK]
- Ignoring duplicates causing wrong minimum
- Sorting array which is inefficient
- Switching to linear search unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
