Leetcode 1146:快照数组(超详细的解法!!!)
in leetcode with 0 comment

Leetcode 1146:快照数组(超详细的解法!!!)

in leetcode with 0 comment

实现支持下列接口的「快照数组」- SnapshotArray:

示例:

输入:["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 

提示:

解题思路

这个问题和之前的问题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

如有问题,希望大家指出!!!

「如果我的文章对你有很大帮助,那么不妨~!」

coordinate

谢谢老板O(∩_∩)O~

使用微信扫描二维码完成支付

Responses