无重叠区间

不念不忘少年蓝@ 2022-05-17 10:49 353阅读 0赞

无重叠区间

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

注意:

  • 可以认为区间的终点总是大于它的起点。
  • 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

示例如下:

  1. 示例 1:
  2. 输入: [ [1,2], [2,3], [3,4], [1,3] ]
  3. 输出: 1
  4. 解释: 移除 [1,3] 后,剩下的区间没有重叠。
  5. 示例 2:
  6. 输入: [ [1,2], [1,2], [1,2] ]
  7. 输出: 2
  8. 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
  9. 示例 3:
  10. 输入: [ [1,2], [2,3] ]
  11. 输出: 0
  12. 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

该问题可以使用动态规划的方式去解,也可以使用贪心算法去求解,算法思想有时间我在补充,具体代码如下:

  • 动态规划解法:

    /* Definition for an interval. public class Interval { int start; int end; Interval() { start = 0; end = 0; } Interval(int s, int e) { start = s; end = e; } } */
    // 动态规划解法
    class Solution {

    1. public int eraseOverlapIntervals(Interval[] intervals) {
    2. if(intervals.length == 0)
    3. return 0;
    4. Arrays.sort(intervals, new Comparator<Interval>(){
    5. public int compare(Interval o1, Interval o2){
    6. if(o1.start != o2.start)
    7. return o1.start - o2.start;
    8. return o1.end - o2.end;
    9. }
    10. });
    11. // memo[i]表示以intervals[i]为结尾的区间能构成的最长不重叠区间序列
    12. int[] memo = new int[intervals.length];
    13. Arrays.fill(memo, 1);
    14. for(int i=1; i<intervals.length; i++)
    15. // memo[i]
    16. for(int j=0; j<i; j++)
    17. if(intervals[i].start >= intervals[j].end) // 第i个区间可以跟着第j个区间后面
    18. memo[i] = Math.max(memo[i], 1+memo[j]);
    19. int res = 0;
    20. for(int i=0; i<memo.length; i++)
    21. res = Math.max(res, memo[i]);
    22. return intervals.length - res;
    23. }

    }

  • 贪心解法

    /* Definition for an interval. public class Interval { int start; int end; Interval() { start = 0; end = 0; } Interval(int s, int e) { start = s; end = e; } } */
    // 贪心解法
    class Solution {

    1. public int eraseOverlapIntervals(Interval[] intervals) {
    2. if(intervals.length == 0)
    3. return 0;
    4. Arrays.sort(intervals, new Comparator<Interval>(){
    5. public int compare(Interval o1, Interval o2){
    6. if(o1.end != o2.end)
    7. return o1.end - o2.end;
    8. return o1.start - o2.start;
    9. }
    10. });
    11. int res = 1;
    12. int pre = 0;
    13. for(int i=1; i<intervals.length; i++)
    14. if(intervals[i].start >= intervals[pre].end){
    15. res++;
    16. pre = i;
    17. }
    18. return intervals.length - res;
    19. }

    }

发表评论

表情:
评论列表 (有 0 条评论,353人围观)

还没有评论,来说两句吧...

相关阅读

    相关 重叠区间

    435. 无重叠区间 > 给定一个区间的集合 intervals ,其中 intervals\[i\] = \[starti, endi\] 。返回 需要移除区间的最小数

    相关 leetcode 435.重叠区间(java 贪心)

    d先根据各区间尾节点进行从小到大排序,然后依次判断下一个区间的开始节点是否大于上一个区间的结束节点,若大于,可留住,若是小于,则发生重叠,删去。这样就能保证尾节点小的留住,为后

    相关 重叠区间

    无重叠区间 算法描述:给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 \[1,2