Bird
Raised Fist0
DSA C++programming

Find Minimum in Rotated Sorted Array in DSA C++

Choose your learning style10 modes available
Mental Model
A rotated sorted array is like a sorted list that has been shifted. The smallest element is the point where the shift happened.
Analogy: Imagine a clock face with numbers 1 to 12 in order. If you rotate the clock so that 3 is at the top, the smallest number is where the rotation starts, like the new '12'.
Original sorted array:
1 -> 2 -> 3 -> 4 -> 5 -> null
Rotated array:
4 -> 5 -> 1 -> 2 -> 3 -> null
          ↑ smallest element
Dry Run Walkthrough
Input: array: [4, 5, 1, 2, 3]
Goal: Find the smallest number in the rotated sorted array
Step 1: Set left=0, right=4 (start and end indices)
[4, 5, 1, 2, 3], left=0, right=4
Why: We start searching the whole array
Step 2: Calculate mid = (0+4)//2 = 2, check value at mid=1
[4, 5, 1, 2, 3], mid=2 (value=1)
Why: Mid helps us decide which half contains the smallest element
Step 3: Compare mid value (1) with right value (3), since 1 < 3, move right to mid
[4, 5, 1, 2, 3], left=0, right=2
Why: Minimum must be in left half including mid
Step 4: Calculate mid = (0+2)//2 = 1, check value at mid=5
[4, 5, 1, 2, 3], mid=1 (value=5)
Why: Check mid again to narrow search
Step 5: Compare mid value (5) with right value (1), since 5 > 1, move left to mid+1
[4, 5, 1, 2, 3], left=2, right=2
Why: Minimum must be in right half excluding mid
Step 6: Left equals right, found minimum at index 2 with value 1
[4, 5, 1, 2, 3], left=2, right=2 (value=1)
Why: Search narrowed to one element which is minimum
Result:
Minimum element is 1 at index 2
Annotated Code
DSA C++
#include <iostream>
#include <vector>
using namespace std;

int findMin(const vector<int>& nums) {
    int left = 0;
    int right = (int)nums.size() - 1;
    while (left < right) {
        int mid = left + (right - left) / 2;  // find middle index
        if (nums[mid] > nums[right]) {
            left = mid + 1;  // minimum is in right half
        } else {
            right = mid;  // minimum is in left half including mid
        }
    }
    return nums[left];  // left == right is minimum
}

int main() {
    vector<int> nums = {4, 5, 1, 2, 3};
    cout << findMin(nums) << endl;
    return 0;
}
int mid = left + (right - left) / 2; // find middle index
Calculate middle index to split search space
if (nums[mid] > nums[right]) {
Check if minimum is in right half by comparing mid and right values
left = mid + 1; // minimum is in right half
Move left pointer to mid+1 to discard left half
right = mid; // minimum is in left half including mid
Move right pointer to mid to keep left half including mid
return nums[left]; // left == right is minimum
Return the minimum element found when pointers meet
OutputSuccess
1
Complexity Analysis
Time: O(log n) because the search space halves each step using binary search
Space: O(1) because only a few variables are used regardless of input size
vs Alternative: Compared to scanning all elements O(n), this binary search method is much faster for large arrays
Edge Cases
Array not rotated (e.g., [1, 2, 3, 4, 5])
Minimum is the first element, code returns it correctly
DSA C++
while (left < right) {
Array with one element (e.g., [10])
Returns the single element as minimum
DSA C++
while (left < right) {
Array rotated at last element (e.g., [2, 3, 4, 5, 1])
Correctly finds minimum at last index
DSA C++
if (nums[mid] > nums[right]) {
When to Use This Pattern
When you see a sorted array that might be rotated and need to find the smallest element quickly, use binary search to find the rotation point.
Common Mistakes
Mistake: Comparing mid value with left instead of right pointer value
Fix: Always compare nums[mid] with nums[right] to decide which half to search
Mistake: Using while (left <= right) instead of while (left < right), causing infinite loop
Fix: Use while (left < right) to ensure pointers converge correctly
Summary
Finds the smallest element in a rotated sorted array using binary search.
Use when you have a sorted array shifted at some pivot and want to find the minimum efficiently.
The smallest element is the only point where the order breaks, found by comparing mid and right values.

Practice

(1/5)
1. What is the main idea behind finding the minimum element in a rotated sorted array?
easy
A. Use a hash map to store elements and find the minimum
B. Sort the array again and pick the first element
C. Traverse the array linearly and pick the smallest element
D. Use binary search to find the point where the order breaks

Solution

  1. 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.
  2. Step 2: Use binary search to find the break point

    Binary search helps find the pivot where the order breaks, which is the minimum element.
  3. Final Answer:

    Use binary search to find the point where the order breaks -> Option D
  4. Quick Check:

    Binary search finds minimum in rotated array [OK]
Hint: Look for the pivot where order breaks using binary search [OK]
Common Mistakes:
  • Trying to sort the array again wastes time
  • Linear search is slower than binary search
  • Using extra space unnecessarily
2. Which of the following is the correct syntax to start a binary search loop in C++ for finding minimum in a rotated sorted array named nums?
easy
A. while (left <= right) { int mid = left + (right - left) / 2; }
B. while (left < right) { int mid = (left + right) / 2; }
C. for (int left = 0, right = nums.size() - 1; left <= right; )
D. for (int i = 0; i < nums.size(); i++)

Solution

  1. Step 1: Understand binary search loop conditions

    For finding minimum in a rotated sorted array, the binary search loop typically uses while (left < right) to avoid infinite loops and correctly narrow down the search space.
  2. Step 2: Check correct mid calculation and loop condition

    while (left < right) { int mid = (left + right) / 2; } is the common and correct approach for this problem.
  3. Final Answer:

    while (left < right) { int mid = (left + right) / 2; } -> Option B
  4. Quick Check:

    Correct binary search loop syntax for this problem [OK]
Hint: Use while with left < right and mid calculation [OK]
Common Mistakes:
  • Using for loop instead of while for binary search
  • Calculating mid as left + (right - left) / 2 with wrong loop condition
  • Using wrong loop condition like left <= right causing infinite loop
3. What will be the output of the following C++ code snippet?
std::vector<int> nums = {4,5,6,7,0,1,2};
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;
}
std::cout << nums[left] << std::endl;
medium
A. 0
B. 4
C. 7
D. 2

Solution

  1. Step 1: Understand the binary search logic on rotated array

    The code compares nums[mid] with nums[right] to decide which half to keep.
  2. Step 2: Trace the loop to find minimum

    Since nums[mid] > nums[right], left moves to mid+1 until left == right at index of minimum (0).
  3. Final Answer:

    0 -> Option A
  4. Quick Check:

    Minimum element found is 0 [OK]
Hint: Compare mid and right to narrow search for minimum [OK]
Common Mistakes:
  • Confusing mid and right comparison direction
  • Printing nums[right] instead of nums[left]
  • Not updating left or right correctly
4. Identify the error in the following code snippet that tries to find the minimum in a rotated sorted array:
int findMin(std::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 - 1;
  }
  return nums[left];
}
medium
A. The else block should set right = mid, not right = mid - 1
B. The loop condition should be left < right, not left <= right
C. The mid calculation causes overflow
D. The return statement should return nums[right], not nums[left]

Solution

  1. Step 1: Analyze the binary search update rules

    When nums[mid] <= nums[right], the minimum is at mid or left side, so right should be set to mid.
  2. Step 2: Identify incorrect update causing skipping minimum

    Setting right = mid - 1 skips mid, possibly missing the minimum element.
  3. Final Answer:

    The else block should set right = mid, not right = mid - 1 -> Option A
  4. Quick Check:

    Correct right update avoids missing minimum [OK]
Hint: Set right = mid to include mid in search [OK]
Common Mistakes:
  • Using left <= right causes infinite loop
  • Returning nums[left] is correct
  • Mid calculation is safe here
5. Given a rotated sorted array nums that may contain duplicates, which modification is needed in the binary search approach to correctly find the minimum element?
hard
A. If nums[mid] == nums[right], return nums[mid] immediately
B. If nums[mid] == nums[right], increase left by one to skip duplicate
C. If nums[mid] == nums[right], reduce right by one to skip duplicate
D. Duplicates do not affect the binary search logic

Solution

  1. Step 1: Understand impact of duplicates on binary search

    Duplicates can cause ambiguity when nums[mid] == nums[right], making it unclear which side to choose.
  2. Step 2: Modify search by reducing right to skip duplicate

    Reducing right by one helps shrink the search space safely without missing the minimum.
  3. Final Answer:

    If nums[mid] == nums[right], reduce right by one to skip duplicate -> Option C
  4. Quick Check:

    Handle duplicates by shrinking right pointer [OK]
Hint: When equal, reduce right to skip duplicates safely [OK]
Common Mistakes:
  • Returning immediately on equality misses minimum
  • Increasing left instead of reducing right causes errors
  • Ignoring duplicates leads to wrong answers
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard