我们用一个哈希表 \(\text{d}\) 来存储任务信息,键为任务 ID,值为一个二元组 \((\text{userId}, \text{priority})\),表示该任务所属的用户 ID 以及任务的优先级。
我们用一个有序集合 \(\text{st}\) 来存储当前系统中的所有任务,元素为一个二元组 \((-\text{priority}, -\text{taskId})\),表示任务的优先级和任务 ID 的相反数。我们将优先级和任务 ID 取相反数是为了让优先级最高且任务 ID 最大的任务在有序集合中排在最前面。
classTaskManager:def__init__(self,tasks:List[List[int]]):self.d={}self.st=SortedList()fortaskintasks:self.add(*task)defadd(self,userId:int,taskId:int,priority:int)->None:self.d[taskId]=(userId,priority)self.st.add((-priority,-taskId))defedit(self,taskId:int,newPriority:int)->None:userId,priority=self.d[taskId]self.st.discard((-priority,-taskId))self.d[taskId]=(userId,newPriority)self.st.add((-newPriority,-taskId))defrmv(self,taskId:int)->None:_,priority=self.d[taskId]self.d.pop(taskId)self.st.remove((-priority,-taskId))defexecTop(self)->int:ifnotself.st:return-1taskId=-self.st.pop(0)[1]userId,_=self.d[taskId]self.d.pop(taskId)returnuserId# 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()
classTaskManager{privatefinalMap<Integer,int[]>d=newHashMap<>();privatefinalTreeSet<int[]>st=newTreeSet<>((a,b)->{if(a[0]==b[0]){returnb[1]-a[1];}returnb[0]-a[0];});publicTaskManager(List<List<Integer>>tasks){for(vartask:tasks){add(task.get(0),task.get(1),task.get(2));}}publicvoidadd(intuserId,inttaskId,intpriority){d.put(taskId,newint[]{userId,priority});st.add(newint[]{priority,taskId});}publicvoidedit(inttaskId,intnewPriority){vare=d.get(taskId);intuserId=e[0],priority=e[1];st.remove(newint[]{priority,taskId});st.add(newint[]{newPriority,taskId});d.put(taskId,newint[]{userId,newPriority});}publicvoidrmv(inttaskId){vare=d.remove(taskId);intpriority=e[1];st.remove(newint[]{priority,taskId});}publicintexecTop(){if(st.isEmpty()){return-1;}vare=st.pollFirst();vart=d.remove(e[1]);returnt[0];}}/** * Your TaskManager object will be instantiated and called as such: * TaskManager obj = new TaskManager(tasks); * obj.add(userId,taskId,priority); * obj.edit(taskId,newPriority); * obj.rmv(taskId); * int param_4 = obj.execTop(); */
classTaskManager{private:unordered_map<int,pair<int,int>>d;set<pair<int,int>>st;public:TaskManager(vector<vector<int>>&tasks){for(constauto&task:tasks){add(task[0],task[1],task[2]);}}voidadd(intuserId,inttaskId,intpriority){d[taskId]={userId,priority};st.insert({-priority,-taskId});}voidedit(inttaskId,intnewPriority){auto[userId,priority]=d[taskId];st.erase({-priority,-taskId});st.insert({-newPriority,-taskId});d[taskId]={userId,newPriority};}voidrmv(inttaskId){auto[userId,priority]=d[taskId];st.erase({-priority,-taskId});d.erase(taskId);}intexecTop(){if(st.empty()){return-1;}autoe=*st.begin();st.erase(st.begin());inttaskId=-e.second;intuserId=d[taskId].first;d.erase(taskId);returnuserId;}};/** * Your TaskManager object will be instantiated and called as such: * TaskManager* obj = new TaskManager(tasks); * obj->add(userId,taskId,priority); * obj->edit(taskId,newPriority); * obj->rmv(taskId); * int param_4 = obj->execTop(); */
typeTaskManagerstruct{dmap[int][2]intst*redblacktree.Tree[int,int]}funcencode(priority,taskIdint)int{return(priority<<32)|taskId}funccomparator(a,bint)int{ifa>b{return-1}elseifa<b{return1}return0}funcConstructor(tasks[][]int)TaskManager{tm:=TaskManager{d:make(map[int][2]int),st:redblacktree.NewWith[int,int](comparator),}for_,task:=rangetasks{tm.Add(task[0],task[1],task[2])}returntm}func(this*TaskManager)Add(userIdint,taskIdint,priorityint){this.d[taskId]=[2]int{userId,priority}this.st.Put(encode(priority,taskId),taskId)}func(this*TaskManager)Edit(taskIdint,newPriorityint){ife,ok:=this.d[taskId];ok{priority:=e[1]this.st.Remove(encode(priority,taskId))this.d[taskId]=[2]int{e[0],newPriority}this.st.Put(encode(newPriority,taskId),taskId)}}func(this*TaskManager)Rmv(taskIdint){ife,ok:=this.d[taskId];ok{priority:=e[1]delete(this.d,taskId)this.st.Remove(encode(priority,taskId))}}func(this*TaskManager)ExecTop()int{ifthis.st.Empty(){return-1}it:=this.st.Iterator()it.Next()taskId:=it.Value()ife,ok:=this.d[taskId];ok{delete(this.d,taskId)this.st.Remove(it.Key())returne[0]}return-1}/** * Your TaskManager object will be instantiated and called as such: * obj := Constructor(tasks); * obj.Add(userId,taskId,priority); * obj.Edit(taskId,newPriority); * obj.Rmv(taskId); * param_4 := obj.ExecTop(); */
classTaskManager{privated:Map<number,[number,number]>;privatepq:PriorityQueue<[number,number]>;constructor(tasks:number[][]){this.d=newMap();this.pq=newPriorityQueue<[number,number]>((a,b)=>{if(a[0]===b[0]){returnb[1]-a[1];}returnb[0]-a[0];});for(consttaskoftasks){this.add(task[0],task[1],task[2]);}}add(userId:number,taskId:number,priority:number):void{this.d.set(taskId,[userId,priority]);this.pq.enqueue([priority,taskId]);}edit(taskId:number,newPriority:number):void{conste=this.d.get(taskId);if(!e)return;constuserId=e[0];this.d.set(taskId,[userId,newPriority]);this.pq.enqueue([newPriority,taskId]);}rmv(taskId:number):void{this.d.delete(taskId);}execTop():number{while(!this.pq.isEmpty()){const[priority,taskId]=this.pq.dequeue();conste=this.d.get(taskId);if(e&&e[1]===priority){this.d.delete(taskId);returne[0];}}return-1;}}/** * Your TaskManager object will be instantiated and called as such: * var obj = new TaskManager(tasks) * obj.add(userId,taskId,priority) * obj.edit(taskId,newPriority) * obj.rmv(taskId) * var param_4 = obj.execTop() */