LeetCode时间键值存储问题:元组集合中忽略值的存在性检查
LeetCode「Time Based Key Value Store」问题解答
为什么_无法生效?
在Python里,_并不是通配符:
- 它仅在解构赋值场景下用作占位符(比如
a, _ = (1, 2),表示忽略第二个值)。 - 当你写出
(timestamp, _)时,Python会将其视为一个包含timestamp和变量_当前值的普通元组,集合的成员检查需要完全匹配元组的所有元素,因此这种写法要么因_未定义报错,要么只能匹配恰好第二个元素等于_值的元组,完全达不到“忽略value”的匹配效果。
最简单的解决方法
你的核心问题是用集合存储元组的方式不适合这种“按timestamp模糊匹配”的场景,最简单的改造是把存储结构换成字典嵌套字典:每个key对应一个以timestamp为键、value为值的子字典,这样可以直接通过timestamp快速查找。
修改后的完整代码:
class TimeMap: def __init__(self): self.map = {} def set(self, key: str, value: str, timestamp: int) -> None: if key not in self.map: self.map[key] = {} # 题目保证同key同timestamp不会重复set,直接覆盖或赋值即可 self.map[key][timestamp] = value def get(self, key: str, timestamp: int) -> str: if key not in self.map: return "" # 从目标timestamp向下遍历,找到第一个存在的timestamp while timestamp >= 0: if timestamp in self.map[key]: return self.map[key][timestamp] timestamp -= 1 return ""
如果想要更高效的查找(避免最坏情况下O(n)的遍历),可以额外维护每个key对应的排序timestamp列表,用二分查找快速定位最大的≤目标timestamp的值,时间复杂度能降到O(logn):
class TimeMap: def __init__(self): self.map = {} # key: {timestamp: value} self.timestamps = {} # key: 递增排序的timestamp列表 def set(self, key: str, value: str, timestamp: int) -> None: if key not in self.map: self.map[key] = {} self.timestamps[key] = [] self.map[key][timestamp] = value self.timestamps[key].append(timestamp) # 题目保证set的timestamp递增,直接追加即可 def get(self, key: str, timestamp: int) -> str: if key not in self.map: return "" ts_list = self.timestamps[key] left, right = 0, len(ts_list) - 1 target_ts = -1 # 二分查找最大的<=目标timestamp的元素 while left <= right: mid = (left + right) // 2 if ts_list[mid] <= timestamp: target_ts = ts_list[mid] left = mid + 1 else: right = mid - 1 return self.map[key][target_ts] if target_ts != -1 else ""
内容的提问来源于stack exchange,提问作者KaiDubauskas
相关产品推荐
相关产品推荐

