侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 471 篇文章
  • 累计创建 108 个标签
  • 累计收到 9 条评论

目 录CONTENT

文章目录

【贪心算法】无重叠区间

GabrielxD
2022-04-17 / 0 评论 / 0 点赞 / 33 阅读 / 365 字 / 正在检测是否收录...
## 题目

435. 无重叠区间


给定一个区间的集合 intervals ,其中 intervals[i] = [start_i, end_i] 。返回 需要移除区间的最小数量,使剩余区间互不重叠

示例 1:

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: intervals = [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

提示:

  • 1 <= intervals.length <= 10^5
  • intervals[i].length == 2
  • -5 * 10^4 <= start_i < end_i <= 5 * 10^4

解题

方法一:贪心算法

思路

需要移除的区间数量 = 所有的区间总数 - 不重叠的区间个数 所以就可以将问题转化为求 不重叠区间的个数 ,把所有区间按照区间右端点大小升序排序,如果遍历到当前区间的左端点大于等于前一个区间的右端点,当前区间即为不重叠区间,计数增加。

代码

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> a[1] - b[1]);
        int len = intervals.length, count = 1, prevEnd = intervals[0][1];
        for (int i = 1; i < len; i++) {
            if (intervals[i][0] >= prevEnd) {
                count++;
                prevEnd = intervals[i][1];
            }
        }

        return len - count;
    }
}
0

评论区