630.课程表III
一、贪心
先根据「结束时间」对 coursescourses 排升序,从前往后考虑每个课程,处理过程中维护一个总时长 sumsum,对于某个课程 courses[i]courses[i] 而言,根据如果学习该课程,是否满足「最晚完成时间」要求进行分情况讨论:
学习该课程后,满足「最晚完成时间」要求,即
sum + courses[i][0] <= courses[i][1]
,则进行学习;学习该课程后,不满足「最晚完成时间」要求,此时从过往学习的课程中找出「持续时间」最长的课程进行「回退」操作(这个持续时长最长的课程有可能是当前课程)。
import heapq
#py没有大根堆。存入负值,用小根堆实现大根堆
class BigHeap:
def __init__(self):
self.arr = list()
#建堆
def heapify(self):
heapq.heapify(self.arr)
#插入
def insert(self, val):
heapq.heappush(self.arr, -val) # 存入负值
#弹出
def pop(self):
val = heapq.heappop(self.arr)
# 先取出再转负
return -val
#返回堆顶
def getTop(self):
if not self.arr:
return
return -self.arr[0]
#判断堆空
def isEmpty(self):
return not self.arr
#返回堆大小
def size(self):
return len(self.arr)
class Solution:
def scheduleCourse(self, courses: List[List[int]]) -> int:
courses.sort(key = lambda x : x[1])
sum = 0
heap = BigHeap()
for duration, lastDay in courses:
sum += duration
heap.insert(duration)
if sum > lastDay:
sum -= heap.pop()
return heap.size()
最后更新于