630.课程表 III
题目描述:
这里有 n
门不同的在线课程,按从 1
到 n
编号。给你一个数组 courses
,其中 courses[i] = [durationi, lastDayi]
表示第 i
门课将会 持续 上 durationi
天课,并且必须在不晚于 lastDayi
的时候完成。
你的学期从第 1
天开始。且不能同时修读两门及两门以上的课程。
返回你最多可以修读的课程数目。
数据范围:
$1\le courses.len \le 10^4, 1\le dur_i,lastday_i\le 10^4$
题解:
如果使用动态规划,建图,求最长路,复杂度就是 $O(n^2)$ 级别的,因为是稠密图。好像有人用 java 的01背包过了(先按照最晚时间排序,然后01背包选择)。
考虑贪心,每次选择结束时间最早的。但是有的结束时间早,持续时间长,在这段时间内可能都可以学几门别的课了(比如可以学一些,结束时间比他晚的,持续时间短的)。
假设遍历到了一个 $[x,y]$ ,但是由于时间限制,在 $y$ 之前不能学完 $x$ ,那么可以考虑去掉一个学过的里面持续时间最长的,因为去掉之后,时间一定可以缩短,可以尝试把 $x$ 加进去,并且科目的数量没变化,但是花费的时间变少了。
因此可以考虑使用堆,带反悔的机制,每次遇到不能放进去的,就要检查堆中持续时间最长的是不是比 $x$ 大,大的话就交换一下。
代码:
1 | class Solution |