实现支持下列接口的「快照数组」- SnapshotArray:
SnapshotArray(int length)
- 初始化一个与指定长度相等的 类数组 的数据结构。初始时,每个元素都等于 0。void set(index, val)
- 会将指定索引index
处的元素设置为val
。int snap()
- 获取该数组的快照,并返回快照的编号snap_id
(快照号是调用snap()
的总次数减去1
)。int get(index, snap_id)
- 根据指定的snap_id
选择快照,并返回该快照指定索引index
的值。
示例:
输入:["SnapshotArray","set","snap","set","get"]
[[3],[0,5],[],[0,6],[0,0]]
输出:[null,null,0,null,5]
解释:
SnapshotArray snapshotArr = new SnapshotArray(3); // 初始化一个长度为 3 的快照数组
snapshotArr.set(0,5); // 令 array[0] = 5
snapshotArr.snap(); // 获取快照,返回 snap_id = 0
snapshotArr.set(0,6);
snapshotArr.get(0,0); // 获取 snap_id = 0 的快照中 array[0] 的值,返回 5
提示:
1 <= length <= 50000
- 题目最多进行
50000
次set
,snap
,和get
的调用 。 0 <= index < length
0 <= snap_id <
我们调用snap()
的总次数0 <= val <= 10^9
解题思路
这个问题和之前的问题Leetcode 981:基于时间的键值存储(超详细的解法!!!)非常类似,所以我们可以采用之前的思想,将每次数据的变化按照[snap_id, val]
的方式存储。
class SnapshotArray:
def __init__(self, n):
self.data = [[[-1, 0]] for _ in range(n)]
self.snap_id = 0
def set(self, index, val):
self.data[index].append([self.snap_id, val])
def snap(self):
self.snap_id += 1
return self.snap_id - 1
def get(self, index, snap_id):
i = bisect.bisect_right(self.data[index], [snap_id, float("inf")]) - 1
return self.data[index][i][1]
当然你可以通过字典将所有变化的数据存储起来
class SnapshotArray:
def __init__(self, length: int):
self.dif = {}
self.snaps = []
def set(self, index: int, val: int) -> None:
self.dif[index] = val
def snap(self) -> int:
self.snaps.append(self.dif.copy())
return len(self.snaps) - 1
def get(self, index: int, snap_id: int) -> int:
return self.snaps[snap_id][index] if index in self.snaps[snap_id] else 0
实际上这样做的效率更高。
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!
「如果我的文章对你有很大帮助,那么不妨~!」
谢谢老板O(∩_∩)O~
使用微信扫描二维码完成支付

本文由 coordinate 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Aug 5, 2019 at 06:26 am