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.

Solution

Time complexity : O(nlog(n))
Space complexity : O(1)

class Solution {
public:
    int removeCoveredIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(),
             [](vector<int>& a, vector<int>& b) {
                 return a[0]==b[0] ? a[1]>b[1] : a[0]<b[0];
             });
        
        int ans = 0, end, prev_end = 0;
        for (vector<int> interval: intervals) {
            end = interval[1];
            if (prev_end < end) {
                ++ans;
                prev_end = end;
            }
        }
        return ans;
    }
};

用start point小至大排序,若start point相同,則較長的end point優先。
因start point已排序,只要一個一個判斷end point是否符合被蓋住的條件即可。