今日题目
https://leetcode.com/problems/design-a-number-container-system/description/
解题思路
在这道题中,我们需要找到列表中某个数字对应的最小索引。 注意,在处理列表时,索引可能会发生变化。 由于我们需要的是最小索引,因此需要一个有序数据结构。 技巧:我们可以使用懒惰标记,记录每个索引对应的数字,只有当发现当前答案不满足要求时才进行弹出操作。
方法
- 维护一个字典,存储每个数字对应的有序索引序列。
- 维护一个字典,存储索引与数字的映射关系。
- 在 find 函数中验证答案是否有效。
复杂度
-
时间复杂度:$O(Q\ times log(N))$,Q 为查询次数,N 为字典大小。
-
空间复杂度:$O(Q)$,Q 为查询次数。
代码
class NumberContainers:
def __init__(self):
self.lst = dict()
self.idx = dict()
def change(self, index: int, number: int) -> None:
if number not in self.lst:
self.lst.update({number: []})
heappush(self.lst[number], index)
self.idx.update({index: number})
def find(self, number: int) -> int:
if number not in self.lst:
return -1
while self.lst[number]:
currIndex = self.lst[number][0]
if self.idx[currIndex] != number:
heappop(self.lst[number])
else:
return currIndex
return -1
# Your NumberContainers object will be instantiated and called as such:
# obj = NumberContainers()
# obj.change(index,number)
# param_2 = obj.find(number)
