Appearance
630-课程表III
说实话这个题目算是寄了,我只能看看解题理解一下喽。
java
class Solution {
public int scheduleCourse(int[][] courses) {
/**
* 按课程截止时间升序排序
* 这主要是来自于生活的尝试,面临多门考试的时候,一般情况下肯定也是先复习靠在前面的科目
* 在一些特定情况下,例如同一天有多门考试,那么肯定是先复习比较简单啊一门科目~
*/
Arrays.sort(courses, (a, b) -> a[1] - b[1]);
/**
* 定义一个优先队列(最大堆)
* 对于时间长的优先级低在队列后面,时间短的课程优先级高
*/
PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> b[0] - a[0]);
// 记录总学习时长
int total = 0;
// 按截止时间从近到远遍历课程
for (int[] course : courses) {
/**
* 如果总时长不会超过截止时间,那么,当前这门课程可以选择,进入队列
* 如果超过了,就要进行比较(和已经入对列的元素)(取出队列中最长的课程,和当前的课程进行对比),选择学习时长较短的课程
*/
if (total + course[0] <= course[1]) {
total += course[0];
heap.offer(course);
/* 队列不为空的情况下,选择队列头的元素(时长最大)和当前的对比 */
} else if (!heap.isEmpty() && heap.peek()[0] > course[0]) {
/* 将本课程入队,原先的课程出队 */
total = total - heap.poll()[0] + course[0];
heap.offer(course);
}
}
return heap.size();
}
}
优先队列
PriorityQueue 这个是java的优先队列要使用这个需要写一个对比的操作,上面的代码使用了一个lambda表达式表示使用时间进行对比,这个优先级别使用数字表示大小,数字越低表示优先级越大。 所以如果一个课程可以进行,并且比其他课程都长会排在最前面。
本题的思路
基本上是在遍历这个课程的时候不断在优化安排的结果,不断的替换掉,时间占用最多的课程,最终形成一个最好的结果。