104 lines
2.1 KiB
Markdown
104 lines
2.1 KiB
Markdown
# Leetcode Non-Overlapping-Intervals
|
|
|
|
2022-09-03 15:34
|
|
|
|
> ##### Algorithms:
|
|
>
|
|
> #algorithm #greedy
|
|
>
|
|
> ##### Data structures:
|
|
>
|
|
> #DS #array
|
|
>
|
|
> ##### Difficulty:
|
|
>
|
|
> #coding_problem #difficulty-medium
|
|
>
|
|
> ##### Additional tags:
|
|
>
|
|
> #<platforms-like-leetcode> #<list-to-be-added>
|
|
>
|
|
> ##### Revisions:
|
|
>
|
|
> N/A
|
|
|
|
##### Links:
|
|
|
|
- [Link to problem](https://leetcode.com/problems/non-overlapping-intervals/)
|
|
|
|
---
|
|
|
|
### Problem
|
|
|
|
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_.
|
|
|
|
#### Examples
|
|
|
|
**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 <= 105`
|
|
- `intervals[i].length == 2`
|
|
- `-5 * 104 <= starti < endi <= 5 * 104`
|
|
|
|
### Thoughts
|
|
|
|
> [!summary]
|
|
> This is a #greedy problem, similar to [[Leetcode Merge-Intervals]]
|
|
|
|
#### Key concept:
|
|
|
|
first sort the intervals.
|
|
|
|
pick the intervals with smallest end, which will allow us to
|
|
make more room for following ones.
|
|
|
|
#tip: Use `&` to reference vectors in comp.function to save
|
|
time.
|
|
|
|
### Solution
|
|
|
|
```cpp
|
|
class Solution {
|
|
static bool comp(vector<int> &a, vector<int> &b) { return a[1] < b[1]; }
|
|
|
|
public:
|
|
int eraseOverlapIntervals(vector<vector<int>> &intervals) {
|
|
|
|
sort(intervals.begin(), intervals.end(), comp);
|
|
|
|
// Using this var to skip overlapping intervals.
|
|
auto before = intervals[0];
|
|
|
|
int ans = 0;
|
|
|
|
for (int i = 1, size = intervals.size(); i < size; i++) {
|
|
if (intervals[i][0] < before[1]) {
|
|
ans++;
|
|
} else {
|
|
before = intervals[i];
|
|
}
|
|
}
|
|
|
|
return ans;
|
|
}
|
|
};
|
|
```
|