Loading

Leetcode-435-无重叠区间

题目链接


题目描述

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠

注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 没有重叠。

要求

O(n)的时间复杂度。

思路

贪心

  1. 去掉的区间尽可能少,即剩余的区间尽可能多

  2. 按照区间的 端点升序,遍历区间,要想剩下的区间尽可能多,
    则发生冲突时,应该选择 端点尽可能小的的区间留下
    这样,后面才有更多的可能容纳更多的区间。。

  3. 如:
    {1,4} {3,5} 留下

C++代码

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& a) {
        sort(a.begin(), a.end());
        int n = a.size();
        int ans = 0, R = a[0][1]; // R 记录上个区间的右端点。

        for (int i = 1; i < n; i++) {
            if (a[i][0] < R) {
                ans ++;
                if (a[i][1] < R) // 去掉右端点大的区间,更新R
                    R = a[i][1];
            }
            else
                R = a[i][1];
        }
        return ans;
    }
};
posted @ 2022-01-12 17:17  ARUI丶  阅读(22)  评论(0编辑  收藏  举报