Leetcode 1834. Single-Threaded CPU [Python]

使用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
    
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值