Formatted question description: https://leetcode.ca/all/1288.html

1288. Remove Covered Intervals (Medium)

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:

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

Example 2:

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

Example 3:

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

Example 4:

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

Example 5:

Input: intervals = [[1,2],[1,4],[3,4]]
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.

Related Topics:
Greedy, Sort, Line Sweep

Solution 1.

// OJ: https://leetcode.com/problems/remove-covered-intervals/

// Time: O(NlogN)
// Space: O(1)
class Solution {
public:
    int removeCoveredIntervals(vector<vector<int>>& A) {
        sort(begin(A), end(A), [](auto &a, auto &b) { return a[0] != b[0] ? a[0] < b[0] : a[1] > b[1]; });
        int ans = A.size(), e = INT_MIN;
        for (auto &r : A) {
            if (r[1] <= e) --ans;
            else e = r[1];
        }
        return ans;
    }
};

Java

class Solution {
    public int removeCoveredIntervals(int[][] intervals) {
        Arrays.sort(intervals, new Comparator<int[]>() {
            public int compare(int[] array1, int[] array2) {
                if (array1[0] != array2[0])
                    return array1[0] - array2[0];
                else
                    return array1[1] - array2[1];
            }
        });
        int length = intervals.length;
        boolean[] remove = new boolean[length];
        for (int i = 0; i < length; i++) {
            int[] interval1 = intervals[i];
            for (int j = i + 1; j < length; j++) {
                int[] interval2 = intervals[j];
                if (interval2[1] <= interval1[1])
                    remove[j] = true;
                if (interval2[0] > interval1[1])
                    break;
            }
        }
        int removeCount = 0;
        for (int i = 0; i < length; i++) {
            if (remove[i])
                removeCount++;
        }
        return length - removeCount;
    }
}

All Problems

All Solutions