【手撕代码】完成任务最少需要几个线程

给定一组任务,每个任务都是独立线程执行,任务包含起始时间和停止时间,求完成这些任务线程池最少需要几个线程。

例如:

输入[0,3),[1,2),[3,5)   (结束时刻不计算在内)

输出2

思路1:建立时间线,寻找同时运行的最大任务数

Python解法:

l = [[0,3], [1,2], [3,5]]
start = []
end = []
for i in l:
    start.append(i[0])
    end.append(i[1])
start.sort()
end.sort()
max_num = 0
count = 0
for t in  range(start[0], end[-1]+1):
    if start and t == start[0]:
            count += 1
            start.pop(0)
    if t == end[0]:
        count -= 1
        end.pop(0)
    max_num = max(count, max_num)
print(max_num)

思路2:按开始时间排序后,维护一有序终止队列。比思路1效率更高,end_list的插入、排序还可以优化。

l = [[0,3], [3,5], [1,2]]
l = sorted(l, key=lambda x :(x[0], x[1]))
cur_time = l[0][0]
end_list = [ l[0][1] ]
max_num = 0
for task in l[1:]:
    cur_time = task[0]
    while end_list and end_list[0] <= cur_time:
        end_list.pop(0)
    end_list.append(task[1])
    end_list.sort()
    max_num = max(max_num, len(end_list))
print(max_num)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值