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.
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.
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.
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.
1 <= intervals.length <= 105
intervals[i].length == 2
-5 * 104 <= starti < endi <= 5 * 104
impl Solution {
pub fn erase_overlap_intervals(intervals: Vec<Vec<i32>>) -> i32 {
let mut intervals = intervals;
let mut stack = vec![];
intervals.sort_unstable();
for i in 0..intervals.len() {
let (start0, end0) = (intervals[i][0], intervals[i][1]);
let &(start1, end1) = stack.last().unwrap_or(&(0, start0));
if start0 >= end1 {
stack.push((start0, end0));
} else if end0 <= end1 {
stack.pop();
stack.push((start0, end0));
}
}
(intervals.len() - stack.len()) as i32
}
}