解题思路
1.将所有课程按照结束时间升序排列,最先结束的需要最先学习
2.利用优先队列记录当前所花费时间最多的课程,当遇到课程无法完成的情况,则从优先队列中找出花费时间最长的课程,将他放弃
代码
class Solution {
public int scheduleCourse(int[][] courses) {
Arrays.sort(courses, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[1] > o2[1]){
return 1;
}else if(o1[1] < o2[1]){
return -1;
}else{
return 0;
}
}
});
int res = 0,day = 0;
//堆顶储存的是当前耗费时间最长的课程
PriorityQueue<Integer> q = new PriorityQueue<Integer>((a, b) -> b - a);
for (int i=0;i<courses.length;i++){
//当前课程可以顺利学完
if (day+courses[i][0] <= courses[i][1]){
day += courses[i][0];
res++;
//当前课程入队
q.offer(courses[i][0]);
continue;
}
//当前课程无法顺利学完,需要放弃掉之前学习耗费时间最长的课程
//之前选修的最长时间的课程时长 大于当前这门课程所需的学习时长
if (!q.isEmpty() && q.peek()>courses[i][0]){
//放弃之前耗费了最长时间的课程
day -= q.poll();
//学习当前这门课程
day += courses[i][0];
q.offer(courses[i][0]);
}
}
return res;
}
}