leetcode 1288. 删除被覆盖区间

问题描述

给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。

只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。

在完成所有删除操作后,请你返回列表中剩余区间的数目。
示例:

输入:intervals = [[1,4],[3,6],[2,8]]
输出:2
解释:区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。

代码

class Solution {
public:
    int removeCoveredIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        int n = intervals.size(),ans = 0;
        //for(int i = 0; i < intervals.size(); ++i)
        //    cout<<"("<<intervals[i][0]<<" , "<<intervals[i][1]<<") "<<endl;
        int left = intervals[0][0],right = intervals[0][1];
        for(int i = 1; i < n; ++i)
        {
            //因为我们已经对端点排好序了,左端点升序,所以一定有left <= intervals[i][0]
            //因此只需要考虑右端点
            if(right >= intervals[i][1])
                ans++;
            else    
                right = intervals[i][1];
        }
        return n-ans;
    }
    //按照起点升序排列,如果起点相同则按照终点降序排列
    static bool cmp(vector<int>&a,vector<int>&b)
    {
        if(a[0] == b[0])
            return a[1] > b[1];
        else    
            return b[0] > a[0];
    }
};

注意右端点一定要降序排列,不然出现以下情况

|----------------|
|---------------------------|

判断不出

结果

执行用时:56 ms, 在所有 C++ 提交中击败了85.42%的用户
内存消耗:11.4 MB, 在所有 C++ 提交中击败了34.72%的用户
posted @ 2020-09-27 20:23  曲径通霄  阅读(150)  评论(0编辑  收藏  举报