题目

Given a list of intervals, remove all intervals that are covered by another interval in the list.

Interval [a,b) is covered by interval [c,d) if and only if c <= a and b <= d.

After doing so, return the number of remaining intervals.

Example 1:

  1. Input: intervals = [[1,4],[3,6],[2,8]]
  2. Output: 2
  3. Explanation: Interval [3,6] is covered by [2,8], therefore it is removed.

Example 2:

  1. Input: intervals = [[1,4],[2,3]]
  2. Output: 1

Example 3:

  1. Input: intervals = [[0,10],[5,12]]
  2. Output: 2

Example 4:

  1. Input: intervals = [[3,10],[4,10],[5,11]]
  2. Output: 2

Example 5:

  1. Input: intervals = [[1,2],[1,4],[3,4]]
  2. Output: 1

Constraints:

  • 1 <= intervals.length <= 1000
  • intervals[i].length == 2
  • 0 <= intervals[i][0] < intervals[i][1] <= 10^5
  • All the intervals are unique.

题意

删除数组中所有被其他区间覆盖的区间。

思路

将数组按照左端点从小到大排序(相同则右端点大的在前),从左到右遍历,记录右端点的最大值rightMax,如果当前区间的右端点小于rightMax,说明该区间被之前的某个区间覆盖,将其删去;否则更新rightMax。


代码实现

Java

  1. class Solution {
  2. public int removeCoveredIntervals(int[][] intervals) {
  3. int cnt = 0;
  4. Arrays.sort(intervals, (int[] a, int[] b) -> a[0] < b[0] ? -1 : a[0] == b[0] ? b[1] - a[1] : 1);
  5. int rightMax = intervals[0][1];
  6. for (int i = 1; i < intervals.length; i++) {
  7. if (intervals[i][1] <= rightMax) {
  8. cnt++;
  9. } else {
  10. rightMax = intervals[i][1];
  11. }
  12. }
  13. return intervals.length - cnt;
  14. }
  15. }