博客
关于我
每日一题 20.12.31 LeetCode 435. 无重叠区间 java题解
阅读量:758 次
发布时间:2019-03-23

本文共 2072 字,大约阅读时间需要 6 分钟。

区间调度问题是一个经典的贪心问题,目标是从给定的区间中选择尽可能多的不相交的区间。可以使用贪心算法或动态规划来解决。

贪心方法

  • 排序:首先将区间按结束时间升序排序。这样可以确保在每一步选择尽可能早结束的区间,使得后续有更多选择余地。
  • 遍历选择:初始化最后一个选择的区间的结束时间为负无穷。然后依次遍历每个区间,如果当前区间的起点不早于最后一个结束的时间,则选择该区间,并更新最后一个结束时间。
  • 结果:最终的区间数量即为所求。
  • 这种方法的时间复杂度是 (O(n \log n)),主要来自于排序的步骤。

    动态规划方法

  • 排序:同样将区间按结束时间排序。
  • 状态定义:创建一个数组 f,其中 f[i] 表示前 i 个区间中最优解的最大数量。
  • 初始条件:将 f[0] 初始化为 1,因为至少有一个区间。
  • 填充状态:对于每个 i,找到最大的 j,使得 j 不与区间 i 重叠,然后 f[i] = f[j] + 1
  • 结果f[n-1] 即为最大区间数量。
  • 这种方法的时间复杂度是 (O(n^2)),适用于较小规模的数据。

    示例代码

    public int eraseOverlapIntervals(int[][] intervals) {    int len = intervals.length;    if (len == 0) return 0;    // 按结束时间排序    Arrays.sort(intervals, new Comparator
    () { @Override public int compare(int[] interval1, int[] interval2) { return interval1[1] - interval2[1]; } }); int lastEnd = -1; int count = 0; for (int i = 0; i < len; i++) { if (intervals[i][0] > lastEnd) { count++; lastEnd = intervals[i][1]; } } return len - count;}

    动态规划示例代码

    public int eraseOverlapIntervals(int[][] intervals) {    int len = intervals.length;    if (len == 0) return 0;    // 按开始时间排序    Arrays.sort(intervals, new Comparator
    () { @Override public int compare(int[] interval1, int[] interval2) { return interval1[0] - interval2[0]; } }); // 初始化动态规划数组 int[] dp = new int[len]; Arrays.fill(dp, 1); // 预处理以便二分查找 List
    endTimes = new ArrayList<>(); for (int i = 0; i < len; i++) { endTimes.add(intervals[i][1]); } // 对于每个区间,找到最大的不重叠区间索引 for (int i = 0; i < len; i++) { int currentStart = intervals[i][0]; int maxEndIndex = i; for (int j = i - 1; j >= 0; j--) { if (endTimes[j] < currentStart) { maxEndIndex = j; break; } } if (maxEndIndex >= 0) { dp[i] = dp[maxEndIndex] + 1; } else { dp[i] = dp[i] + 1; } } int max = dp[len - 1]; return max;}

    结果

    无论采用哪种方法,目标是最大化不相交的区间数量。动态规划方法通常更复杂,但对于理解问题有帮助。贪心方法在该情况下更为高效。

    转载地址:http://twjzk.baihongyu.com/

    你可能感兴趣的文章
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>
    MySQL中地理位置数据扩展geometry的使用心得
    查看>>
    Mysql中存储引擎简介、修改、查询、选择
    查看>>
    Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
    查看>>
    mysql中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    Mysql中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>
    mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
    查看>>
    Mysql中文乱码问题完美解决方案
    查看>>
    mysql中的 +号 和 CONCAT(str1,str2,...)
    查看>>
    Mysql中的 IFNULL 函数的详解
    查看>>
    mysql中的collate关键字是什么意思?
    查看>>
    MySql中的concat()相关函数
    查看>>
    mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
    查看>>
    MySQL中的count函数
    查看>>