Non Overlapping Intervals Minimum Removal in DSA Python - Time & Space Complexity
We want to find out how fast the algorithm runs when removing intervals to avoid overlaps.
How does the time needed grow as the number of intervals increases?
Analyze the time complexity of the following code snippet.
def eraseOverlapIntervals(intervals):
intervals.sort(key=lambda x: x[1])
count = 0
end = float('-inf')
for interval in intervals:
if interval[0] >= end:
end = interval[1]
else:
count += 1
return count
This code sorts intervals by their end time and counts how many intervals must be removed to avoid overlaps.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Sorting the intervals and then looping through them once.
- How many times: Sorting takes multiple comparisons depending on number of intervals; the loop runs once for each interval.
Sorting takes more time as intervals increase, and the loop grows linearly.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 30 to 40 operations |
| 100 | About 700 to 800 operations |
| 1000 | About 10,000 to 12,000 operations |
Pattern observation: Sorting grows faster than looping, roughly n log n, while the loop grows linearly.
Time Complexity: O(n log n)
This means the time needed grows a bit faster than the number of intervals because of sorting, but the main loop adds only a simple pass.
[X] Wrong: "The loop alone decides the time complexity, so it must be O(n)."
[OK] Correct: Sorting the intervals before looping takes more time, and it dominates the total time, making it O(n log n).
Understanding how sorting affects time helps you explain your solution clearly and shows you know how to analyze real problems efficiently.
"What if the intervals were already sorted by end time? How would the time complexity change?"
Practice
Non Overlapping Intervals Minimum Removal problem?Solution
Step 1: Understand the problem goal
The problem asks to remove the fewest intervals so that no two intervals overlap.Step 2: Differentiate from related problems
Unlike merging intervals or counting overlaps, here we minimize removals to avoid overlaps.Final Answer:
To find the minimum number of intervals to remove so that the rest do not overlap -> Option AQuick Check:
Minimum removals = non-overlapping intervals [OK]
- Confusing with merging intervals problem
- Trying to maximize overlaps instead of minimizing removals
- Sorting intervals incorrectly
Solution
Step 1: Identify sorting by end time
Sorting by end time means using the second element of each interval, which is index 1.Step 2: Check the correct syntax
Usingintervals.sort(key=lambda x: x[1])sorts intervals ascending by end time.Final Answer:
intervals.sort(key=lambda x: x[1]) -> Option CQuick Check:
Sort by end time = key=lambda x: x[1] [OK]
- Sorting by start time instead of end time
- Using reverse=True when not needed
- Incorrect lambda syntax
intervals = [[1,3],[2,4],[3,5]]
intervals.sort(key=lambda x: x[1])
count = 0
end = float('-inf')
for interval in intervals:
if interval[0] >= end:
end = interval[1]
else:
count += 1
print(count)Solution
Step 1: Sort intervals by end time
Sorted intervals: [[1,3],[2,4],[3,5]] (already sorted by end time)Step 2: Iterate and count overlaps
Start with end = -inf
Interval [1,3]: 1 >= -inf true, update end=3
Interval [2,4]: 2 >= 3 false, count=1
Interval [3,5]: 3 >= 3 true, update end=5Final Answer:
1 -> Option BQuick Check:
One interval removed to avoid overlap [OK]
- Not updating end correctly
- Counting non-overlapping intervals instead of removals
- Sorting by start time instead of end time
def eraseOverlapIntervals(intervals):
intervals.sort(key=lambda x: x[0])
count = 0
end = float('-inf')
for interval in intervals:
if interval[0] >= end:
end = interval[1]
else:
count += 1
return countSolution
Step 1: Check sorting key
The code sorts intervals by start time, but to minimize removals, sorting by end time is needed.Step 2: Understand impact of sorting
Sorting by start time can cause wrong overlap checks and incorrect count of removals.Final Answer:
Sorting by start time instead of end time causes incorrect results -> Option DQuick Check:
Sort by end time to minimize removals [OK]
- Sorting by start time
- Incorrect initialization of end
- Returning wrong value
[[1,2],[2,3],[3,4],[1,3]], what is the minimum number of intervals to remove to make the rest non-overlapping?Solution
Step 1: Sort intervals by end time
Sorted intervals: [[1,2],[2,3],[1,3],[3,4]]Step 2: Select intervals greedily and count removals
Start end = -inf
[1,2]: 1 >= -inf true, end=2
[2,3]: 2 >= 2 true, end=3
[1,3]: 1 >= 3 false, count=1 (remove this)
[3,4]: 3 >= 3 true, end=4Final Answer:
1 -> Option AQuick Check:
One interval removed to avoid overlap [OK]
- Not sorting by end time
- Counting non-overlapping intervals instead of removals
- Removing wrong intervals
Ready to prove it?
Pass the test and this pattern moves unknown
