-
发表于 2024.04.26
-
简单想法是每次快照时,都存一份完整的列表,但这样会导致内存超限。优化思路类似于开散列法的哈希表。其中每个索引
self._arr[i]
使用一个桶来存储快照信息,其元素为一个记录快照id和值的元组(snap_id, val)
。只有调用set
保存的时候,才针对index
新建一个快照信息。当使用get
查询某个索引index
内特定快照snap_id
的值时,使用二分法搜索桶内self._arr[index]
快照id小于等于snap_id
最大者,并提取出val
即可。class SnapshotArray: def __init__(self, length: int): self._arr = [[(0, 0)] for _ in range(length)] self._next_snap = 0 # 下一次的快照id def set(self, index: int, val: int) -> None: last_snap, _ = self._arr[index][-1] if last_snap == self._next_snap: # 本次快照已经有值 self._arr[index][-1] = (self._next_snap, val) else: # 否则新建一个快照状态 self._arr[index].append((self._next_snap, val)) def snap(self) -> int: ans = self._next_snap self._next_snap += 1 return ans def get(self, index: int, snap_id: int) -> int: # 二分查找小于等于snap_id的最大值 lo, hi = 0, len(self._arr[index]) - 1 while lo <= hi: mid = (lo + hi) >> 1 if self._arr[index][mid][0] > snap_id: hi = mid - 1 else: lo = mid + 1 return self._arr[index][hi][1]
- LC 题目链接
-