---
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)
```
