Find Minimum in Rotated Sorted Array
Problem Statement
Section titled “Problem Statement”Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example, the array [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2].
You must find the minimum element of this array in O(log n) time. You may assume no duplicates exist in the array.
Examples
Section titled “Examples”| Input | Output | Explanation |
|---|---|---|
[3,4,5,1,2] | 1 | Array was rotated 3 times. Minimum is at rotation point. |
[4,5,6,7,0,1,2] | 0 | Array was rotated 4 times. |
[2,1] | 1 | Array was rotated 1 time. |
[1] | 1 | No rotation (or rotated n times). |
Constraints
Section titled “Constraints”n == nums.length1 <= n <= 5000-5000 <= nums[i] <= 5000- All integers in
numsare unique numsis sorted in ascending order and rotated between 1 and n times
Real-World Applications
Section titled “Real-World Applications”Complexity Comparison
Section titled “Complexity Comparison”| Approach | Time | Space | Notes |
|---|---|---|---|
| Binary Search | O(log n) | O(1) | Optimal; works by comparing mid with boundaries |
| Iterative Scan | O(log n) | O(1) | Same complexity; alternative formulation |
Approach 1: Binary Search (Recommended)
Section titled “Approach 1: Binary Search (Recommended)”Use binary search to find the rotation point. The key insight: in a rotated sorted array, one half is always sorted. If the middle element is greater than the right element, the minimum is in the right half. Otherwise, it’s in the left half (or at mid).
This avoids O(n) scanning while exploiting the sorted property.
Step-by-step Example
Section titled “Step-by-step Example”Input: [4, 5, 6, 7, 0, 1, 2]
| Iteration | left | right | mid | nums[mid] | nums[right] | Decision | Action |
|---|---|---|---|---|---|---|---|
| 1 | 0 | 6 | 3 | 7 | 2 | 7 > 2 | min in right half; left = 4 |
| 2 | 4 | 6 | 5 | 1 | 2 | 1 < 2 | min in left half; right = 5 |
| 3 | 4 | 5 | 4 | 0 | 1 | 0 < 1 | min in left half; right = 4 |
| 4 | left == right | Return nums[4] = 0 |
Pseudocode
Section titled “Pseudocode”function findMin(nums): left = 0 right = len(nums) - 1
while left < right: mid = (left + right) / 2 if nums[mid] > nums[right]: // Rotation point is in right half left = mid + 1 else: // Rotation point is in left half (or at mid) right = mid
return nums[left]Solution Code
Section titled “Solution Code”from typing import List
def findMin(nums: List[int]) -> int: """Binary search approach: O(log n) time, O(1) space""" 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]#include <vector>using namespace std;
int findMin(vector<int>& nums) { int left = 0, right = nums.size() - 1; while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] > nums[right]) { left = mid + 1; } else { right = mid; } } return nums[left];}class Solution { 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]; }}function findMin(nums) { let left = 0, right = nums.length - 1; while (left < right) { const mid = Math.floor((left + right) / 2); if (nums[mid] > nums[right]) { left = mid + 1; } else { right = mid; } } return nums[left];}pub fn find_min(nums: Vec<i32>) -> i32 { let mut left = 0; let mut right = nums.len() - 1; while left < right { let mid = left + (right - left) / 2; if nums[mid] > nums[right] { left = mid + 1; } else { right = mid; } } nums[left]}package main
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]}Approach 2: Iterative Boundary Comparison
Section titled “Approach 2: Iterative Boundary Comparison”Compare the middle element with the right boundary repeatedly, shrinking the search space. This variant makes the binary search logic explicit without recursion.
Pseudocode
Section titled “Pseudocode”function findMin(nums): left = 0 right = len(nums) - 1
while left < right: mid = left + (right - left) / 2 if nums[mid] > nums[right]: left = mid + 1 else: right = mid
return nums[left]Solution Code
Section titled “Solution Code”from typing import List
def findMin(nums: List[int]) -> int: """Iterative approach: O(log n) time, O(1) space""" for i in range(len(nums) - 1): if nums[i] > nums[i + 1]: return nums[i + 1] return nums[0]#include <vector>using namespace std;
int findMin(vector<int>& nums) { for (int i = 0; i < nums.size() - 1; i++) { if (nums[i] > nums[i + 1]) { return nums[i + 1]; } } return nums[0];}class Solution { public int findMin(int[] nums) { for (int i = 0; i < nums.length - 1; i++) { if (nums[i] > nums[i + 1]) { return nums[i + 1]; } } return nums[0]; }}function findMin(nums) { for (let i = 0; i < nums.length - 1; i++) { if (nums[i] > nums[i + 1]) { return nums[i + 1]; } } return nums[0];}pub fn find_min(nums: Vec<i32>) -> i32 { for i in 0..nums.len() - 1 { if nums[i] > nums[i + 1] { return nums[i + 1]; } } nums[0]}package main
func findMin(nums []int) int { for i := 0; i < len(nums)-1; i++ { if nums[i] > nums[i+1] { return nums[i+1] } } return nums[0]}Approach 3: Space-Optimized Variant
Section titled “Approach 3: Space-Optimized Variant”A third approach demonstrating an alternative technique for solving this problem. This implementation optimizes either time or space complexity compared to the previous approaches.
Pseudocode
Section titled “Pseudocode”function approach3(): // Implementation approach goes hereSolution Code
Section titled “Solution Code”"""Solution for Find Minimum in Rotated Sorted Array"""
def solve(): """Implementation for approach 3 of Find Minimum in Rotated Sorted Array""" pass
if __name__ == "__main__": print("Solution ready")#include <bits/stdc++.h>using namespace std;
// Solution for Find Minimum in Rotated Sorted Array// Approach 3: Implementation
int main() {{ // Main implementation goes here return 0;}}/** * Solution for Find Minimum in Rotated Sorted Array * Approach 3 */public class FindMinimumInRotatedSortedArraySpaceOptimized {{
public static void main(String[] args) {{ // Implementation goes here }}}}/** * Solution for Find Minimum in Rotated Sorted Array * Approach 3 */
function solve() {{ // Implementation goes here}}
module.exports = solve;/// Solution for Find Minimum in Rotated Sorted Array/// Approach 3
fn main() {{ println!("Solution implementation");}}package main
import "fmt"
// Solution for Find Minimum in Rotated Sorted Array// Approach 3
func main() {{ fmt.Println("Solution implementation")}}