Implement a SnapshotArray that supports the following interface:
SnapshotArray(int length)
initializes an array-like data structure with the given length. Initially, each element equals 0.void set(index, val)
sets the element at the givenindex
to be equal toval
.int snap()
takes a snapshot of the array and returns thesnap_id
: the total number of times we calledsnap()
minus1
.int get(index, snap_id)
returns the value at the givenindex
, at the time we took the snapshot with the givensnap_id
Solution0:
class SnapshotArray: def __init__(self, length: int): self.array = [[0] for i in range(length)] self.indx = [[0] for i in range(length)] self.snaps = 0 def set(self, index: int, val: int) -> None: snaps = self.snaps self.indx[index].append(snaps) self.array[index].append(val) def snap(self) -> int: self.snaps += 1 return self.snaps - 1 def get(self, index: int, snap_id: int) -> int: if not self.indx[index]: return 0 left = 0 right = len(self.indx[index]) - 1 while (left < right): mid = left + (right - left)//2 if (self.indx[index][mid] > snap_id): right = mid else: left = mid + 1 if self.indx[index][left] > snap_id: return self.array[index][left-1] else: return self.array[index][left]
Solution1:
class SnapshotArray(object): def __init__(self, length): """ :type length: int """ self.snaps = 0 self.store = dict() self.store[0] = dict() def set(self, index, val): """ :type index: int :type val: int :rtype: None """ self.store[self.snaps][index] = val def snap(self): """ :rtype: int """ self.snaps += 1 a = (self.store[self.snaps -1]).copy() self.store[self.snaps] = a return self.snaps -1 def get(self, index, snap_id): """ :type index: int :type snap_id: int :rtype: int """ if index in self.store[snap_id]: return self.store[snap_id][index] else: return 0