leetcode435 无重叠区间

文章目录

  • 1. 解法
  • 2.原题 [435. 无重叠区间](https://leetcode.cn/problems/non-overlapping-intervals/)


1. 解法

选择的区间结尾越小,则留给其他区间的空间越大,则留下的区间越多,移除的区间越少。根据贪心策略,优先保留区间结尾较小且不相交的区间。

  1. 将所有区间按照结尾大小升序排列
  2. 每次选择 结尾最小(第1步已经升序排列,所以在循环中就是当前区间) 并且和前一个区间不重叠的区间(当前区间的开始 大于 前一个区间的结束 就不会重叠)
class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        if (intervals.length == 1){
            return 0;
        }
        Arrays.sort(intervals, new Comparator<int[]>() {//按照区间结尾升序排列
            @Override
            public int compare(int[] o1, int[] o2) {//这里o1表示位于前面的对象,o2表示后面的对象
                return o1[1] - o2[1];//返回-1(或负数),表示不需要交换o1和o2的位置,o1排在o2前面
                                    //返回1(或正数),表示需要交换o1和o2的位置,o1排在o2后面
            }
        });
        int removed = 0;//需要移除区间的数量
        int prev = intervals[0][1];//上一个区间的结尾
        for (int i = 1; i < intervals.length; i++) {//检查所有区间
            if(prev > intervals[i][0]){//上一个留下的区间的结尾大于当前区间的开始,说明当前区间与前面留下的有重叠,移除
                removed++;
            }else{//否则,留下区间,并替换上一个区间的结束
                prev = intervals[i][1];
            }
        }
        return removed;
    }
}

2.原题 435. 无重叠区间

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

示例 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 < = i n t e r v a l s . l e n g t h < = 105 1 <= intervals.length <= 105 1<=intervals.length<=105
  • i n t e r v a l s [ i ] . l e n g t h = = 2 intervals[i].length == 2 intervals[i].length==2
  • − 5 ∗ 104 < = s t a r t i < e n d i < = 5 ∗ 104 -5 * 104 <= starti < endi <= 5 * 104 5104<=starti<endi<=5104

你可能感兴趣的:(leetcode,算法,数据结构)