Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources
Non-overlapping Intervals

Non-overlapping Intervals

Problem Statement

Given a collection of intervals [start, end], find the minimum number of intervals to remove to make the rest non-overlapping. This medium-level greedy problem is like scheduling—keep as many events as possible without conflicts!

Example

Input: intervals = [[1,2],[2,3],[3,4],[1,3]]

Output: 1 (remove [1,3])

Input: intervals = [[1,2],[1,2],[1,2]]

Output: 2 (remove two [1,2]s)

Code

Java
Python
JavaScript
public class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[1], b[1]));
        int count = 0;
        int end = intervals[0][1];
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] < end) {
                count++;
            } else {
                end = intervals[i][1];
            }
        }
        return count;
    }
}
            
def erase_overlap_intervals(intervals):
    intervals.sort(key=lambda x: x[1])
    count = 0
    end = intervals[0][1]
    for i in range(1, len(intervals)):
        if intervals[i][0] < end:
            count += 1
        else:
            end = intervals[i][1]
    return count
            
function eraseOverlapIntervals(intervals) {
    intervals.sort((a, b) => a[1] - b[1]);
    let count = 0;
    let end = intervals[0][1];
    for (let i = 1; i < intervals.length; i++) {
        if (intervals[i][0] < end) {
            count++;
        } else {
            end = intervals[i][1];
        }
    }
    return count;
}
            

Explanation

  • Greedy Choice: Sort by end time, keep the interval ending earliest.
  • Flow: Count overlaps to remove when start times conflict with the current end.
  • Example: [[1,2],[1,3],[2,3],[3,4]] → keep [1,2], remove [1,3], keep [2,3],[3,4].

Note

Time complexity: O(n log n), Space complexity: O(1). Clear the clutter efficiently!