Bird
Raised Fist0
DSA Rustprogramming~5 mins

Find Minimum in Rotated Sorted Array in DSA Rust - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Find Minimum in Rotated Sorted Array
O(log n)
Understanding Time Complexity

We want to know how fast we can find the smallest number in a rotated sorted list.

How does the time needed change as the list gets bigger?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.

fn find_min(nums: &[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]
}

This code finds the smallest number in a rotated sorted array using a binary search approach.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The while 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.
How Execution Grows With Input

Each step cuts the list roughly in half, so the number of steps grows slowly as the list grows.

Input Size (n)Approx. Operations
10About 4 steps
100About 7 steps
1000About 10 steps

Pattern observation: Doubling the input size adds only one more step.

Final Time Complexity

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.

Common Mistake

[X] Wrong: "Since the list is rotated, we must check every element to find the minimum."

[OK] Correct: The binary search approach uses the sorted parts to skip many elements, so it does not need to check all.

Interview Connect

Knowing how to use binary search in tricky ways like this shows you understand efficient searching beyond simple cases.

Self-Check

"What if the array contains duplicates? How would the time complexity change?"

Practice

(1/5)
1. What is the main goal when finding the minimum in a rotated sorted array?
easy
A. To sort the array back to original order
B. To find the smallest element after the rotation point
C. To count how many times the array was rotated
D. To find the largest element in the array

Solution

  1. Step 1: Understand the rotated sorted array

    A rotated sorted array is a sorted array shifted some positions, so the smallest element is the rotation point.
  2. Step 2: Identify the minimum element

    The minimum element is the smallest value after the rotation point, which is what we want to find.
  3. Final Answer:

    To find the smallest element after the rotation point -> Option B
  4. Quick Check:

    Minimum element = smallest after rotation [OK]
Hint: Look for the smallest number where order breaks [OK]
Common Mistakes:
  • Confusing minimum with maximum element
  • Trying to count rotations instead of finding minimum
  • Assuming array is fully sorted without rotation
2. Which Rust code snippet correctly declares a function to find the minimum in a rotated sorted array?
easy
A. fn find_min(nums: &[i32]) -> i32 { /* implementation */ }
B. function find_min(nums: Vec<i32>) -> i32 { }
C. def find_min(nums: &[i32]) -> i32 { }
D. fn find_min(nums: Vec<i32>) { return i32; }

Solution

  1. Step 1: Check Rust function syntax

    Rust functions start with fn, parameters have types, and return type is after ->.
  2. Step 2: Validate each option

    fn find_min(nums: &[i32]) -> i32 { /* implementation */ } uses correct Rust syntax with slice &[i32] and return type i32. Others use wrong keywords or syntax.
  3. Final Answer:

    fn find_min(nums: &[i32]) -> i32 { /* implementation */ } -> Option A
  4. Quick Check:

    Rust fn syntax with &[i32] and -> i32 [OK]
Hint: Rust functions use fn, param: type, -> return_type [OK]
Common Mistakes:
  • Using 'function' keyword instead of 'fn'
  • Mixing Python or JavaScript syntax
  • Incorrect return type placement
3. What is the output of the following Rust code?
fn main() {
    let nums = vec![4,5,6,7,0,1,2];
    let min = find_min(&nums);
    println!("{}", min);
}

fn find_min(nums: &[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]
}
medium
A. 0
B. 4
C. 7
D. 2

Solution

  1. Step 1: Understand the binary search logic

    The code uses binary search to find the smallest element by comparing mid and right elements.
  2. Step 2: Trace the loop with input [4,5,6,7,0,1,2]

    Mid moves to find the point where array rotates; finally left points to 0, the smallest element.
  3. Final Answer:

    0 -> Option A
  4. Quick Check:

    Minimum in rotated array = 0 [OK]
Hint: Binary search narrows to smallest element [OK]
Common Mistakes:
  • Returning nums[mid] instead of nums[left]
  • Confusing left and right pointers
  • Not handling rotation correctly
4. Identify the bug in this Rust function to find the minimum in a rotated sorted array:
fn find_min(nums: &[i32]) -> i32 {
    let mut left = 0;
    let mut right = nums.len();
    while left < right {
        let mid = left + (right - left) / 2;
        if nums[mid] > nums[right] {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    nums[left]
}
medium
A. nums[left] should be nums[right] at the end
B. left should start at 1 instead of 0
C. mid calculation causes infinite loop
D. right should be nums.len() - 1 to avoid out-of-bounds

Solution

  1. Step 1: Check initialization of right pointer

    right is set to nums.len(), which is out of array bounds (index max is len-1).
  2. Step 2: Correct right initialization

    right should be nums.len() - 1 to avoid accessing nums[right] out of bounds.
  3. Final Answer:

    right should be nums.len() - 1 to avoid out-of-bounds -> Option D
  4. Quick Check:

    Array index max = len-1 [OK]
Hint: Array indices go from 0 to len-1 [OK]
Common Mistakes:
  • Using nums.len() as index causes panic
  • Starting left at 1 misses first element
  • Changing mid calculation unnecessarily
5. Given a rotated sorted array that may contain duplicates, which modification is needed in the binary search to find the minimum correctly?
fn find_min(nums: &[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 if nums[mid] < nums[right] {
            right = mid;
        } else {
            right -= 1; // What is the reason for this?
        }
    }
    nums[left]
}
hard
A. To avoid infinite loop by always moving left
B. To speed up search by skipping elements
C. To handle duplicates by shrinking right when equal to mid
D. To sort the array during search

Solution

  1. Step 1: Understand duplicates effect

    When nums[mid] equals nums[right], we cannot decide which side minimum lies, so we reduce right by one.
  2. Step 2: Reason for right -= 1

    This safely shrinks the search space without missing the minimum, handling duplicates correctly.
  3. Final Answer:

    To handle duplicates by shrinking right when equal to mid -> Option C
  4. Quick Check:

    Duplicates need careful right pointer move [OK]
Hint: When equal, reduce right to handle duplicates [OK]
Common Mistakes:
  • Ignoring duplicates causes wrong minimum
  • Moving left instead of right when equal
  • Assuming no duplicates in rotated array
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