435. 无重叠区间(贪心算法)


435. 无重叠区间

题目

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

注意:

可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
在这里插入图片描述

解题思路

先计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间的个数。得到的就是“需要移除区间的数量”。

在每次选择中,区间的结尾越小,留给后面的区间的空间越大,那么后面能够选择的区间个数也就越大,故而需要移除的区间数量就越小。

按区间的结尾进行排序,每次选择结尾最小,并且和前一个区间不重叠的区间
在这里插入图片描述

详情见书P383

代码

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        int n = intervals.length;

        //求出有n个区间不会重叠,剩下的区间就是需要去除的。
        return n - intervals(intervals);
    }

    /**
     * 最多有n个 区间不会重叠
     *
     * @param intervals
     * @return
     */
    public int intervals(int[][] intervals) {
        if (intervals.length == 0) {
            return 0;
        }
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            //按照end升序排列
            public int compare(int[] o1, int[] o2) {
                return o1[1] - o2[1];
            }
        });
        //至少有一个区间不相交,就是只有一个区间的时候
        int count = 1;
        //排序后第一个区间就是x
        int x_end = intervals[0][1];

        for (int[] interval : intervals) {
            int start = interval[0];
            if (start >= x_end) {
                //找到下一个选择的区间了
                count++;
                x_end = interval[1];
            }
        }
        return count;
    }
}

文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录