力扣2349.设计数字容器系统
-
懒删除堆
- 用一个哈希表存每个下标的数
- 用一个哈希表存每个元素对应的修改记录
- change时先不删
- find时再开始删
- 取number对应的修改记录(小根堆)
- 如果当前以栈顶为下标的元素!=number的话 说明该位置已经又被修改过了
- 所以当前栈顶下标无效 直接pop
- 直到找到合法位置 返回栈顶或-1
-
class NumberContainers { unordered_map<int,int> m; unordered_map<int,priority_queue<int,vector<int>,greater<>>> ms; public: void change(int index, int number) { m[index] = number; ms[number].push(index); } int find(int number) { auto it = ms.find(number); if(it == ms.end()) return -1; auto &q = it->second; while(!q.empty() && m[q.top()] != number) q.pop(); return q.empty() ? -1 : q.top(); } };