--- title: '435. Non-overlapping Intervals' description: Given an array of intervals intervals where intervals[i] = [starti, endi], return the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping icon: dot topics: - { name: "Array", slug: "array" } - { name: "Dynamic Programming", slug: "dynamic-programming" } - { name: "Greedy", slug: "greedy" } - { name: "Sorting", slug: "sorting" } issue: "https://github.com/prdlk/leetcode/issues/183" sidebar: label: 'Non-overlapping Intervals' badge: 'Medium' --- ### Example 1: - Input: `intervals = [[1,2],[2,3],[3,4],[1,3]]` - Output: `1` - Explanation: `[1,3]` can be removed and the rest of the `intervals` are non-overlapping. ### Example 2: - Input: `intervals = [[1,2],[1,2],[1,2]]` - Output: `2` - Explanation: You need to remove two `[1,2]` to make the rest of the `intervals` non-overlapping. ### Example 3: - Input: `intervals = [[1,2],[2,3]]` - Output: `0` - Explanation: You don't need to remove any of the `intervals` since they're already non-overlapping. ### Constraints: - `1 <= intervals.length <= 10^5` - `intervals[i].length == 2` - `-5 * 10^4 <= starti < endi <= 5 * 10^4` ## Solution ```py class Solution: def eraseOverlapIntervals(self, intervals: list[list[int]]) -> int: intervals.sort(key=lambda x: x[0]) result = [] for start, end in intervals: # Use '<' to avoid intervals which touch if result and start < result[-1][1]: result[-1][1] = min(result[-1][1], end) else: result.append([start, end]) # Difference between original and result is to remove return len(intervals) - len(result) ```