Bird
Raised Fist0
DSA Rustprogramming~5 mins

Count Occurrences of Element in Sorted Array in DSA Rust - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the main advantage of using a sorted array to count occurrences of an element?
A sorted array allows us to use binary search to find the first and last positions of the element quickly, making the counting efficient.
Click to reveal answer
beginner
Explain how binary search helps in counting occurrences of an element in a sorted array.
Binary search finds the first and last index of the element. The count is last index minus first index plus one.
Click to reveal answer
intermediate
In Rust, what is the benefit of using slices (&[T]) when working with arrays for searching?
Slices allow safe, efficient access to parts of arrays without copying data, making search operations faster and memory-friendly.
Click to reveal answer
beginner
What is the time complexity of counting occurrences of an element in a sorted array using binary search?
O(log n), where n is the number of elements in the array.
Click to reveal answer
beginner
Why is it incorrect to count occurrences by scanning the entire array linearly when the array is sorted?
Because it takes O(n) time, which is slower than binary search's O(log n). Using binary search leverages sorting for faster counting.
Click to reveal answer
What is the first step to count occurrences of an element in a sorted array?
ASort the array again
BScan the entire array from start to end
CRemove duplicates from the array
DFind the first occurrence index of the element using binary search
If the first occurrence of element x is at index 3 and last occurrence is at index 7, how many times does x appear?
A7
B4
C5
D10
What is the time complexity of binary search?
AO(log n)
BO(1)
CO(n log n)
DO(n)
Which Rust feature helps avoid copying data when searching in arrays?
ASlices
BVectors
CTuples
DEnums
Why is binary search preferred over linear scan in a sorted array?
ABinary search uses less memory
BBinary search is faster with O(log n) time
CBinary search is simpler to implement
DBinary search works on unsorted arrays
Describe the steps to count occurrences of an element in a sorted array using binary search.
Think about how to find boundaries of the element's positions.
You got /4 concepts.
    Explain why binary search is efficient for counting occurrences in a sorted array compared to linear scanning.
    Compare time complexities and use of sorting.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main advantage of using binary search to count occurrences of an element in a sorted array?
      easy
      A. It counts elements without searching
      B. It sorts the array automatically
      C. It reduces the search time to logarithmic complexity
      D. It works only on unsorted arrays

      Solution

      1. Step 1: Understand binary search efficiency

        Binary search divides the search space in half each time, making it very fast on sorted arrays.
      2. Step 2: Compare with linear search

        Linear search checks each element, which is slower (linear time). Binary search is faster (logarithmic time).
      3. Final Answer:

        It reduces the search time to logarithmic complexity -> Option C
      4. Quick Check:

        Binary search = O(log n) time [OK]
      Hint: Binary search halves search space each step [OK]
      Common Mistakes:
      • Thinking binary search sorts the array
      • Assuming binary search works on unsorted arrays
      • Confusing counting with searching
      2. Which Rust code snippet correctly declares a function to count occurrences of target in a sorted slice arr?
      easy
      A. fn count_occurrences(arr: &[i32], target: i32) -> usize { /* code */ }
      B. fn count_occurrences(arr: Vec<i32>, target: i32) -> i32 { /* code */ }
      C. fn count_occurrences(arr: &[i32], target: i32) -> i32 { /* code */ }
      D. fn count_occurrences(arr: Vec<i32>, target: i32) -> usize { /* code */ }

      Solution

      1. Step 1: Check parameter types

        Using a slice &[i32] is efficient for read-only access without ownership transfer.
      2. Step 2: Check return type

        Counting occurrences returns a non-negative number, so usize is appropriate.
      3. Final Answer:

        fn count_occurrences(arr: &[i32], target: i32) -> usize { /* code */ } -> Option A
      4. Quick Check:

        Slice + usize return = correct signature [OK]
      Hint: Use slice &[i32] and usize for count [OK]
      Common Mistakes:
      • Using Vec when slice is enough
      • Returning i32 instead of usize for counts
      • Confusing ownership with borrowing
      3. What is the output of this Rust code counting occurrences of 3 in the sorted array?
      fn main() {
          let arr = [1, 2, 3, 3, 3, 3, 5];
          let count = count_occurrences(&arr, 3);
          println!("{}", count);
      }
      
      fn count_occurrences(arr: &[i32], target: i32) -> usize {
          let first = arr.binary_search(&target).unwrap_or_else(|x| x);
          let mut count = 0;
          for &num in &arr[first..] {
              if num == target {
                  count += 1;
              } else {
                  break;
              }
          }
          count
      }
      medium
      A. 4
      B. 3
      C. 1
      D. 0

      Solution

      1. Step 1: Find occurrence index

        binary_search returns Ok(index) for 3 at index 2.
      2. Step 2: Count consecutive 3s from index 2

        Elements at indices 2,3,4,5 are 3, so count = 4.
      3. Final Answer:

        4 -> Option A
      4. Quick Check:

        4 occurrences counted correctly [OK]
      Hint: Start counting from binary_search index [OK]
      Common Mistakes:
      • Using unwrap_or_else returns insertion point, not found index
      • Counting beyond target elements
      • Not breaking loop on different element
      4. Identify the bug in this Rust function that counts occurrences of target in a sorted array arr:
      fn count_occurrences(arr: &[i32], target: i32) -> usize {
          let start = arr.binary_search(&target).unwrap_or_else(|_| 0);
          let mut count = 0;
          for &num in &arr[start..] {
              if num == target {
                  count += 1;
              } else {
                  break;
              }
          }
          count
      }
      medium
      A. Function returns i32 instead of usize
      B. The loop does not break on different element
      C. binary_search returns index of last occurrence, not first
      D. unwrap_or_else(|_| 0) returns 0 even if target not found, causing wrong count

      Solution

      1. Step 1: Understand unwrap_or_else behavior

        unwrap_or_else(|_| 0) returns 0 if target not found, which is incorrect start index.
      2. Step 2: Consequence of wrong start index

        Counting from 0 when target is absent counts wrong elements, giving wrong count.
      3. Final Answer:

        unwrap_or_else(|_| 0) returns 0 even if target not found, causing wrong count -> Option D
      4. Quick Check:

        unwrap_or_else should use insertion point or handle not found [OK]
      Hint: Use unwrap_or_else with insertion point for not found [OK]
      Common Mistakes:
      • Using unwrap_or_else(|| 0)
      • Not breaking loop on different element
      • Confusing first and last occurrence index
      5. Given a sorted array arr with possible duplicates, which Rust approach best counts occurrences of target efficiently and correctly for all cases, including when target is absent? Options: A) Use binary_search to find insertion points of target and target+1, then subtract indices. B) Use binary_search to find any occurrence, then count forward until different element. C) Use linear scan from start to end counting matches. D) Use binary_search to find last occurrence, then count backward until different element.
      hard
      A. Find one occurrence with binary_search, count forward until different element
      B. Find insertion points for target and target+1, subtract to get count
      C. Linear scan entire array counting matches
      D. Find last occurrence with binary_search, count backward until different element

      Solution

      1. Step 1: Understand insertion points method

        Finding insertion points for target and target+1 gives start and end indices of target range.
      2. Step 2: Calculate count by subtraction

        Subtracting these indices gives exact count, even if target is absent (count = 0).
      3. Step 3: Compare with other methods

        Counting forward or backward after binary_search can fail if target not found; linear scan is slow.
      4. Final Answer:

        Find insertion points for target and target+1, subtract to get count -> Option B
      5. Quick Check:

        Insertion points subtraction = accurate count [OK]
      Hint: Use binary_search for insertion points, subtract indices [OK]
      Common Mistakes:
      • Counting forward without checking if target found
      • Using linear scan on large arrays
      • Counting backward without binary_search for last occurrence
      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