JZX轻语:简
LeetCode 1146 - 快照数组
发表于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]