使用heap。把task按照进队列时间,持续时间,和原始的index组成新的三元组然后排序,设置一个时间T,记录当前的时间,设置一个队列,就是已经入队列的cpu待处理的任务,当tasks里的任务的时间小于等于当前时间的时候,就把tasks里的任务压到cpu的队列中,同时队列弹出一个任务后,更新时间,也就是把当前时间+队列弹出的任务的处理时间,如果cpu队列里没有任务了,且当前时间小于tasks中的最前面一个任务的入队列时间的话,则直接更新时间到tasks中最前面一个任务的入队时间,这里的小细节是一定要确保队列中已经没有任务了,否则,如果队列中还有任务,时间就还需要更新,之后才能拿新的时间去对比tasks中的最靠前的待处理任务的入队时间。
最后确保cpu队列的任务全出处理完,也就是第二个最靠外的while循环。
class Solution:
def getOrder(self, tasks: List[List[int]]) -> List[int]:
newtask = []
for index, task in enumerate(tasks):
entime, durtime = task[0], task[1]
newtask.append((entime, durtime, index))
newtask.sort(key = lambda x:x[0])
time = newtask[0][0]
que = []
res = []
while newtask:
if not que and time < newtask[0][0]:
time = newtask[0][0]
while newtask and time >= newtask[0][0]:
ent, dur, index = newtask.pop(0)
que.append((dur, index, ent))
heapq.heapify(que)
if que:
dur, index, ent = heapq.heappop(que)
time += dur
res.append(index)
while que:
dur, index, ent = heapq.heappop(que)
time += dur
res.append(index)
return res