目录
链接:1146. 快照数组
1.题意:
初始化一个长度为length里面都是0的数组
set:将数组中的index位置值更新
snap:将当前数组中保存,就像浏览器历史记录一样,并且返回snap_id
get:获取指定历史版本中的index值
2.思路:
在保存历史版本的时候我们可以创建一个二维数组来保存,但那样需要的空间太多了,而且每次set的时候只修改一个对应下标的值。
我们可以每次set修改的时候不去修改数组,而是保存这次set的修改记录[index,val],就是创建一个版本的记录器historys记录每个下标的修改历史记录[index,val]。等到get获取历史版本的时候通过historys找到对应的下标历史版本,用二分查找找到版本历史,在通过正规版本历史就可以取到当前历史的修改值val了
3.代码:
class SnapshotArray:
def __init__(self, length: int):
self.snap_num=0
self.historys=defaultdict(list)
def set(self, index: int, val: int) -> None:
self.historys[index].append((self.snap_num,val))
def snap(self) -> int:
self.snap_num+=1
return self.snap_num-1
def get(self, index: int, snap_id: int) -> int:
i=bisect_left(self.historys[index],(snap_id,inf))-1
return self.historys[index][i][1] if i>=0 else 0