Count Occurrences of Element in Sorted Array in DSA Python - Time & Space Complexity
We want to know how fast we can count how many times a number appears in a sorted list.
How does the time needed change as the list gets bigger?
Analyze the time complexity of the following code snippet.
def count_occurrences(arr, x):
def binary_search_left():
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] < x:
left = mid + 1
else:
right = mid - 1
return left
def binary_search_right():
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] <= x:
left = mid + 1
else:
right = mid - 1
return right
left_index = binary_search_left()
right_index = binary_search_right()
if left_index > right_index:
return 0
return right_index - left_index + 1
This code finds the first and last positions of the target number using two binary searches, then calculates how many times it appears.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Two binary search loops.
- How many times: Each binary search runs about log n times, where n is the list size.
Each binary search cuts the search space roughly in half each step.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 2 * 4 = 8 steps |
| 100 | About 2 * 7 = 14 steps |
| 1000 | About 2 * 10 = 20 steps |
Pattern observation: The steps grow slowly as the list grows, roughly doubling the list size adds only one more step per binary search.
Time Complexity: O(log n)
This means the time to count occurrences grows slowly, even if the list gets very large.
[X] Wrong: "Counting occurrences by checking each element one by one is fast enough."
[OK] Correct: Checking every element takes time proportional to the list size, which is much slower than binary search for large lists.
Knowing how to use binary search to count occurrences shows you understand how to use sorted data efficiently, a skill that helps solve many real problems quickly.
"What if the array was not sorted? How would the time complexity change?"
Practice
Solution
Step 1: Understand the problem statement
The problem asks to find how many times a specific element appears in a sorted array.Step 2: Identify the required output
The output is the count of occurrences of that element, not its position or sum.Final Answer:
The number of times a given element appears in a sorted array -> Option AQuick Check:
Count occurrences = number of times element appears [OK]
- Confusing count with element position
- Trying to sum elements instead of counting
- Ignoring that array is sorted
x in a sorted list arr using built-in methods?Solution
Step 1: Recall Python list methods
count()returns how many times an element appears in a list.Step 2: Check other methods
find()andindex()find positions, not counts;length()is invalid.Final Answer:
count = arr.count(x) -> Option BQuick Check:
Use count() to get occurrences [OK]
- Using index() instead of count()
- Trying to use find() which is for strings
- Using length() which is not a list method
def count_occurrences(arr, x):
return arr.count(x)
arr = [1, 2, 2, 2, 3, 4]
x = 2
print(count_occurrences(arr, x))Solution
Step 1: Understand the input array and element
The array is [1, 2, 2, 2, 3, 4] and the element to count is 2.Step 2: Count occurrences of 2 in the array
2 appears three times in the array.Final Answer:
3 -> Option DQuick Check:
Count of 2 in array = 3 [OK]
- Counting unique elements instead of occurrences
- Miscounting the number of 2s
- Confusing count with index
x in a sorted array arr:def count_occurrences(arr, x):
count = 0
for i in range(len(arr)):
if arr[i] == x:
count += 1
else:
break
return count
arr = [1, 2, 2, 2, 3, 4]
x = 2
print(count_occurrences(arr, x))Solution
Step 1: Analyze the loop and break condition
The loop breaks on first element not equal to x, so it counts only consecutive occurrences from start.Step 2: Check the input array and x
Since x=2 and array starts with 1, the loop breaks immediately, count remains 0.Final Answer:
The loop breaks too early, missing some occurrences -> Option AQuick Check:
Break stops counting early, so count is wrong [OK]
- Breaking loop on first non-match in unsorted array
- Not counting all occurrences
- Assuming array starts with x
arr = [1, 2, 2, 2, 3, 4, 4, 5], which approach efficiently counts occurrences of x = 4 without scanning the entire array?Solution
Step 1: Understand the array is sorted
Since the array is sorted, all 4s are together in a block.Step 2: Use binary search to find first and last occurrence
Binary search finds first and last index of 4 quickly, then count = last - first + 1.Step 3: Compare other options
For loop and count() scan entire array, sorting again is unnecessary and inefficient.Final Answer:
Use binary search to find first and last positions of 4, then calculate count -> Option CQuick Check:
Binary search + index difference = count [OK]
- Scanning entire array instead of using binary search
- Sorting array again unnecessarily
- Using count() without considering efficiency
Ready to prove it?
Pass the test and this pattern moves unknown
