3408. 设计任务管理器(Rating 1806)
3408. 设计任务管理器(Rating 1806)
以下内容偏向于记录个人练习过程及思考,请审慎阅读。
题目
思路
维护以下三个数据结构即可
- 维护一个dict,记录taskId -> userId的映射关系
- 维护一个dict,记录taskId -> priority的映射关系
- 维护一个SortedSet,维护(priority, taskId)
- (这里参考题解,也可以用普通有序list/优先队列/最大堆做懒更新,pop的时候跟最新的记录对一下就行,如果对不上说明这个记录已经被动过了,继续遍历即可)
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class TaskManager:
def __init__(self, tasks: List[List[int]]):
self.t2u = dict() # 维护一个dict,记录taskId -> userId的映射关系
self.t2p = dict() # 维护一个dict,记录taskId -> priority的映射关系
self.sst = SortedSet() # 维护一个SortedSet,维护(priority, taskId)
for userId, taskId, priority in tasks:
self.t2u[taskId] = userId
self.t2p[taskId] = priority
self.sst.add((priority, taskId))
def add(self, userId: int, taskId: int, priority: int) -> None:
self.t2u[taskId] = userId
self.t2p[taskId] = priority
self.sst.add((priority, taskId))
def edit(self, taskId: int, newPriority: int) -> None:
oldPriority = self.t2p[taskId]
self.t2p[taskId] = newPriority
self.sst.remove((oldPriority, taskId))
self.sst.add((newPriority, taskId))
def rmv(self, taskId: int) -> None:
del self.t2u[taskId]
priority = self.t2p[taskId]
del self.t2p[taskId]
self.sst.remove((priority, taskId))
def execTop(self) -> int:
if not self.sst:
return -1
priority, taskId = self.sst[-1]
userId = self.t2u[taskId]
self.rmv(taskId)
return userId
# Your TaskManager object will be instantiated and called as such:
# obj = TaskManager(tasks)
# obj.add(userId,taskId,priority)
# obj.edit(taskId,newPriority)
# obj.rmv(taskId)
# param_4 = obj.execTop()
本文由作者按照 CC BY 4.0 进行授权