Bird
Raised Fist0
DSA Rustprogramming~20 mins

Binary Search as Divide and Conquer in DSA Rust - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Binary Search Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Recursive Binary Search Call
What is the output of the following Rust code that performs a recursive binary search for the value 7 in a sorted array?
DSA Rust
fn binary_search(arr: &[i32], target: i32, low: usize, high: usize) -> Option<usize> {
    if low > high {
        return None;
    }
    let mid = low + (high - low) / 2;
    if arr[mid] == target {
        Some(mid)
    } else if arr[mid] > target {
        binary_search(arr, target, low, mid - 1)
    } else {
        binary_search(arr, target, mid + 1, high)
    }
}

fn main() {
    let arr = [1, 3, 5, 7, 9, 11];
    let result = binary_search(&arr, 7, 0, arr.len() - 1);
    println!("{:?}", result);
}
ANone
BSome(2)
CSome(3)
DSome(4)
Attempts:
2 left
💡 Hint
Remember that array indices start at 0 and the array is sorted.
🧠 Conceptual
intermediate
1:30remaining
Understanding Divide and Conquer in Binary Search
Which statement best describes how binary search uses the divide and conquer approach?
AIt searches both halves of the array simultaneously to find the target faster.
BIt searches the array linearly but divides the target value into smaller parts.
CIt divides the array into multiple parts and searches all parts in parallel.
DIt divides the array into two halves and recursively searches only the half that may contain the target.
Attempts:
2 left
💡 Hint
Think about how the search space changes after each comparison.
🔧 Debug
advanced
2:30remaining
Identify the Bug in Binary Search Implementation
What error will occur when running this Rust binary search code and why?
DSA Rust
fn binary_search(arr: &[i32], target: i32, low: usize, high: usize) -> Option<usize> {
    if low > high {
        return None;
    }
    let mid = low + (high - low) / 2;
    if arr[mid] == target {
        Some(mid)
    } else if arr[mid] > target {
        binary_search(arr, target, low, mid - 1)
    } else {
        binary_search(arr, target, mid + 1, high)
    }
}

fn main() {
    let arr = [2, 4, 6, 8, 10];
    let result = binary_search(&arr, 1, 0, arr.len() - 1);
    println!("{:?}", result);
}
APanic due to unsigned integer underflow when mid is 0 and mid - 1 is computed
BReturns None even if the target is present
CInfinite recursion causing stack overflow
DCompiles but returns wrong index for target
Attempts:
2 left
💡 Hint
Check the base case condition and what happens when mid is zero.
🚀 Application
advanced
3:00remaining
Binary Search on a Rotated Sorted Array
Given a rotated sorted array, which approach correctly finds the target using binary search?
AAlways search the left half first, then the right half if not found
BCheck which half is sorted, then decide which half to search next based on target position
CPerform linear search because binary search does not work on rotated arrays
DSort the array first, then perform binary search
Attempts:
2 left
💡 Hint
In a rotated array, one half is always sorted.
❓ Predict Output
expert
2:30remaining
Output of Iterative Binary Search with Edge Cases
What is the output of this Rust code performing iterative binary search for target 15 in the array?
DSA Rust
fn binary_search_iter(arr: &[i32], target: i32) -> Option<usize> {
    let mut low = 0;
    let mut high = arr.len();
    while low < high {
        let mid = low + (high - low) / 2;
        if arr[mid] == target {
            return Some(mid);
        } else if arr[mid] < target {
            low = mid + 1;
        } else {
            high = mid;
        }
    }
    None
}

fn main() {
    let arr = [5, 10, 15, 20, 25];
    let result = binary_search_iter(&arr, 15);
    println!("{:?}", result);
}
ASome(2)
BSome(3)
CNone
DSome(1)
Attempts:
2 left
💡 Hint
Remember that array indices start at 0 and the target is 15.

Practice

(1/5)
1. What is the main idea behind Binary Search as a divide and conquer algorithm?
easy
A. Sort the list first, then search linearly
B. Check every element one by one until the target is found
C. Repeatedly split the sorted list in half to find the target
D. Use a hash table to find the target instantly

Solution

  1. Step 1: Understand divide and conquer in binary search

    Binary search works by dividing the sorted list into two halves and deciding which half to search next.
  2. Step 2: Identify the correct approach

    It repeatedly splits the list in half, narrowing down the search space until the target is found or no elements remain.
  3. Final Answer:

    Repeatedly split the sorted list in half to find the target -> Option C
  4. Quick Check:

    Divide and conquer = split list halves [OK]
Hint: Binary search halves the list each step [OK]
Common Mistakes:
  • Thinking binary search checks every element
  • Assuming list must be unsorted
  • Confusing binary search with linear search
2. Which of the following is the correct Rust function signature for a binary search function that returns an Option<usize>?
easy
A. fn binary_search(arr: &[i32], target: i32) -> Option<usize>
B. fn binary_search(arr: Vec bool
C. fn binary_search(arr: &[i32], target: i32) -> usize
D. fn binary_search(arr: &mut [i32], target: i32) -> i32

Solution

  1. Step 1: Understand Rust function signature for binary search

    The function takes a slice of integers and a target integer, returning an Option with the index if found.
  2. Step 2: Match the correct signature

    Option<usize> is used to return Some(index) if found or None if not found, matching fn binary_search(arr: &[i32], target: i32) -> Option<usize>.
  3. Final Answer:

    fn binary_search(arr: &[i32], target: i32) -> Option<usize> -> Option A
  4. Quick Check:

    Return Option<usize> for index or None [OK]
Hint: Use Option<usize> to handle found or not found [OK]
Common Mistakes:
  • Returning usize without Option causes errors if not found
  • Using Vec instead of slice for input unnecessarily
  • Returning bool loses index information
3. What will be the output of this Rust code snippet using binary search?
fn binary_search(arr: &[i32], target: i32) -> Option<usize> {
    let mut left = 0;
    let mut right = arr.len() - 1;
    while left <= right {
        let mid = left + (right - left) / 2;
        if arr[mid] == target {
            return Some(mid);
        } else if arr[mid] < target {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    None
}

fn main() {
    let nums = [2, 4, 6, 8, 10];
    println!("{:?}", binary_search(&nums, 6));
}
medium
A. Some(3)
B. Some(2)
C. None
D. Some(1)

Solution

  1. Step 1: Trace binary search on array [2,4,6,8,10] for target 6

    Initial left=0, right=4, mid=2. arr[2]=6 matches target.
  2. Step 2: Return index 2 wrapped in Some

    Since arr[mid] == target, function returns Some(2).
  3. Final Answer:

    Some(2) -> Option B
  4. Quick Check:

    Index of 6 in array is 2 [OK]
Hint: Check mid index value equals target first [OK]
Common Mistakes:
  • Off-by-one errors in mid calculation
  • Confusing index with value
  • Returning None incorrectly when target exists
4. Identify the bug in this binary search Rust code and choose the correct fix:
fn binary_search(arr: &[i32], target: i32) -> Option<usize> {
    let mut left = 0;
    let mut right = arr.len();
    while left <= right {
        let mid = left + (right - left) / 2;
        if arr[mid] == target {
            return Some(mid);
        } else if arr[mid] < target {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    None
}
medium
A. Change while condition to left < right
B. Change mid calculation to (left + right) / 2 without subtraction
C. Remove else if and use only if and else
D. Change right initialization to arr.len() - 1

Solution

  1. Step 1: Analyze right boundary initialization

    Right is set to arr.len(), which is out of bounds since indexing is 0-based.
  2. Step 2: Fix right to arr.len() - 1 to avoid out-of-bounds access

    Setting right to arr.len() - 1 ensures mid index stays within valid range.
  3. Final Answer:

    Change right initialization to arr.len() - 1 -> Option D
  4. Quick Check:

    Right boundary must be last valid index [OK]
Hint: Right index = length - 1 for zero-based arrays [OK]
Common Mistakes:
  • Using arr.len() as right causes panic
  • Changing while condition incorrectly
  • Incorrect mid calculation causing overflow
5. Given a sorted array with possible duplicate values, how can you modify binary search to find the first occurrence of a target value?
hard
A. After finding target at mid, continue searching left half to find earlier occurrence
B. Return immediately when target is found at mid
C. Search right half only after finding target
D. Use linear search after binary search to find first occurrence

Solution

  1. Step 1: Understand duplicates and first occurrence requirement

    Binary search normally returns any matching index, but to find first occurrence, we must check if earlier duplicates exist.
  2. Step 2: Modify search to continue left after finding target

    When target is found at mid, record index and continue searching left half to find if an earlier occurrence exists.
  3. Final Answer:

    After finding target at mid, continue searching left half to find earlier occurrence -> Option A
  4. Quick Check:

    Find first occurrence by searching left after match [OK]
Hint: Keep searching left half after finding target [OK]
Common Mistakes:
  • Stopping search immediately on first match
  • Searching right half instead of left
  • Using linear search unnecessarily
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