1288. Remove Covered Intervals
T: O(nlogn)
S: O(1)
class Solution {
public int removeCoveredIntervals(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> a[0] != b[0] ? a[0] - b[0] : b[1] - a[1]);
int prevEnd = 0;
int res = 0;
for (int[] interval : intervals) {
if (interval[1] > prevEnd) { // not covered case
res++;
prevEnd = interval[1]; // so preEnd is the new end (not covered case, 獨立的)
}
}
return res;
}
}
/*
[[1, 4],
[3, 6],
[2, 8]]
[[1, 4],
[2,3]]
The interval [a, b) is covered by the interval [c, d) if and only if c <= a and b <= d.
1.
[[1, 4],
[2, 8]]
[3, 6], -> cover: interval[1] (6) <= prevEnd (8)
becuase sort start, so start will asc
so covered case is => new end <= prev end
=> so not covered case is:
when new end > prev end => do result++ and update prevEnd = new end
2.
but there is a edge case, when start is the same
like this, => new end > prev end, res++ will fail, actually it's covered
|----|
|------|
res ++ means no cover, so no merge, so add intervals,
in this case, fail to detect there is a cover, so res++
so trick way is when start is same, do end sort desc
=> become this, so new end > prev end works!
|------|
|----|
detect there is a cover, so dont do res++
[[1, 4],
[2, 8]]
[3, 6],
4, 5
T:O(nlogn)
S: O(1)
*/
new - this style also work for 2345
T:O(nlogn)
S: O(1)
```java
class Solution {
public int removeCoveredIntervals(int[][] intervals) {
// when start are the same, select long end first
// |------------|. (select long end first, for merging)
// |----|
Arrays.sort(intervals, (a, b) -> a[0] == b[0] ? b[1] - a[1] : a[0] - b[0]);
int n = intervals.length;
int count = 0;
int i = 0;
while (i < n) {
int j = i+1;
count++;
while (j < n && intervals[i][1] >= intervals[j][1]) {
j++;
}
i = j;
}
return count;
}
}
/*
1 4
2 8
3 6
*/
```
latest version:
```java
class Solution {
public int removeCoveredIntervals(int[][] intervals) {
// when start are the same, sort by end desc for ex: [[1,2],[1,4],[3,4]]
Arrays.sort(intervals, (a,b) -> a[0] == b[0] ? Integer.compare(b[1], a[1]) : Integer.compare(a[0], b[0]));
int s = intervals[0][0];
int e = intervals[0][1];
int count = intervals.length;
for (int i = 1; i < intervals.length; i++) {
if (s <= intervals[i][0] && e >= intervals[i][1]) { // when s e can cover current interval, remove it
count--;
} else {
s = intervals[i][0];
e = intervals[i][1];
}
}
return count;
}
}
/***
T: O(nlogn)
S: O(1)
1 2
1 4
3 4
2 8
1 4
3 6
1 4
2 3
1 10
2 3
4 5
[ ]
[ ]
*/
```
Last updated