假设我们有一个间隔列表,其中每个间隔都像[start,end),并且还有一个称为类型的字符串列表。现在,对于给定的i,interval [i]显示某人从[开始,结束)开始从事工作类型[i]的时间。相同类型的两个间隔永远不会重叠或接触。因此,我们必须找到一个排序的合并列表,其中每个项目都有[start,end,num_types],指示从头到尾,num_types个正在处理的任务数。
因此,如果输入是间隔= [[0,3],[5,7],[0,7]]类型= [“解决问题”,“新闻”,“游戏”],则输出将为为[[0,3,2],[3,5,1],[5,7,2]],因为我们正在完成以下几种工作:[0,3)在“问题解决”和“ [3,5)之间的“游戏”,以及[5,7)之间的“新闻”和“游戏”。
为了解决这个问题,我们将遵循以下步骤-
ev:=一个新列表
对于间隔中的每个间隔开始端对(s,e),执行
在ev的末尾插入(s,1)
在ev的末尾插入(e,-1)
排序列表ev
cnt:= 0,最后:= -1
ans:=一个新列表
对于ev中事件的每个时间和增量参数(t,inc),执行
cnt:= cnt + inc
如果t与last不相同且cnt与0不相同,则
最后:= t
返回ans
让我们看下面的实现以更好地理解-
class Solution: def solve(self, intervals, jobs): ev = [] for s, e in intervals: ev.append((s, 1)) ev.append((e, −1)) ev.sort() cnt = 0 last = −1 ans = [] for t, inc in ev: if t != last and cnt != 0: ans.append([last, t, cnt]) cnt += inc last = t return ans ob = Solution()intervals = [ [0, 3], [5, 7], [0, 7] ] types = ["problem solving", "news", "game play"] print(ob.solve(intervals, types))
[[0, 3],[5, 7],[0, 7]], ["problem solving", "news", "game play"]
输出结果
[[0, 3, 2], [3, 5, 1], [5, 7, 2]]