mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-03 05:27:36 +00:00
62 lines
2.1 KiB
Plaintext
62 lines
2.1 KiB
Plaintext
---
|
|
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"
|
|
companies:
|
|
- { name: "Microsoft", period: "Thirty Days", frequency: 57.2 }
|
|
- { name: "Google", period: "Thirty Days", frequency: 29 }
|
|
- { name: "Grammarly", period: "Three Months", frequency: 100 }
|
|
- { name: "Amazon", period: "Three Months", frequency: 28.9 }
|
|
- { name: "IBM", period: "Six Months", frequency: 60.1 }
|
|
- { name: "Bloomberg", period: "Six Months", frequency: 25.5 }
|
|
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)
|
|
```
|