Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
现在前端很多岗位面试需要有一定的算法基础,或者说经常刷算法的会优先考虑。
因此每天刷刷LeetCode非常有必要
在这之前我也刷过一些算法题,也希望以后也坚持刷,跟某掘友一样,我也想刷穿 LeetCode
一、题目描述
这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。
你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。
返回你最多可以修读的课程数目。
示例 1:
输入:courses = [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]
输出:3
解释:
这里一共有 4 门课程,但是你最多可以修 3 门:
首先,修第 1 门课,耗费 100 天,在第 100 天完成,在第 101 天开始下门课。
第二,修第 3 门课,耗费 1000 天,在第 1100 天完成,在第 1101 天开始下门课程。
第三,修第 2 门课,耗时 200 天,在第 1300 天完成。
第 4 门课现在不能修,因为将会在第 3300 天完成它,这已经超出了关闭日期。
示例 2:
输入: courses = [[1,2]]
输出: 1
二、思路分析
首先按ddl的时间从小到大排序,毕竟ddl靠后的就可以后考虑
按照排序的顺序将课程修习需要的时间存入priorityQueue
之后依次将需要的时间用learningTime计时
当遇到超时时,则判断新课的时间是否比已修课程的最大课程时间短
满足短的情况就可以让新课取代用时最大的课程
没准还能省出来时间多修一门呢
最后看priorityQueue里有多少个元素就是最多可以修多少门课
三、代码实现
/**
* @param {number[][]} courses
* @return {number}
*/
var scheduleCourse = function(courses) {
courses.sort((a,b) => a[1] - b[1])
const priorityQ = []
let learningT = 0
//依次修课程
for(let i = 0; i < courses.length; i++){
//判断超时条件,不超时就往死里学
if(learningT + courses[i][0] <= courses[i][1]){
learningT += courses[i][0]
priorityQ.push(courses[i][0])
//每存入一门课都sort一下让用时最久的课程放在数组最后,方便弹出pop
priorityQ.sort((a,b) => a - b)
continue
}
//新课程比已修课程中最大时间课程(数组末尾的课程)时间短,则替换,并重新排序
if(courses[i][0] <= priorityQ[priorityQ.length - 1]){
out = priorityQ.pop()
learningT -= out
learningT += courses[i][0]
priorityQ.push(courses[i][0])
priorityQ.sort((a,b) => a-b)
continue
}
}
return priorityQ.length
}
四、总结
以上就是本道题的所有内容了,本系列会持续更,欢迎点赞、关注、收藏,另外如有其他的问题,欢迎下方留言给我,我会第一时间回复你,感谢~