LeetCode 1146. Snapshot Array 二分 空

231 篇文章 0 订阅
120 篇文章 1 订阅

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 given index to be equal to val.
int snap() takes a snapshot of the array and returns the snap_id: the total number of times we called snap() minus 1.
int get(index, snap_id) returns the value at the given index, at the time we took the snapshot with the given snap_id
 

Example 1:

Input: ["SnapshotArray","set","snap","set","get"]
[[3],[0,5],[],[0,6],[0,0]]
Output: [null,null,0,null,5]
Explanation: 
SnapshotArray snapshotArr = new SnapshotArray(3); // set the length to be 3
snapshotArr.set(0,5);  // Set array[0] = 5
snapshotArr.snap();  // Take a snapshot, return snap_id = 0
snapshotArr.set(0,6);
snapshotArr.get(0,0);  // Get the value of array[0] with snap_id = 0, return 5
 

Constraints:

1 <= length <= 50000
At most 50000 calls will be made to set, snap, and get.
0 <= index < length
0 <= snap_id < (the total number of times we call snap())
0 <= val <= 10^9

-------------------------------------------

Solution 1: Copy the whole snapshot, waste space

Solution 2: upper_bound-1,take care the empty list

from collections import defaultdict

class SnapshotArray:

    def __init__(self, length: int):
        self.idx = 0
        self.snap_dic = defaultdict(list)

    def set(self, index: int, val: int) -> None:
        lst = self.snap_dic[index] #bug2: read first, empty list
        if (lst and lst[-1][0] == self.idx):
            lst[-1][1] = val
        else:
            lst.append([self.idx,val])

    def snap(self) -> int:
        self.idx += 1
        return self.idx-1

    def get(self, index: int, snap_id: int) -> int:
        def upper_bound(lst, target):
            l,r = 0,len(lst)-1
            while (l <= r):
                mid = l + ((r-l)>>1)
                if (lst[mid][0] <= target):
                    l = mid+1
                else:
                    r = mid-1
            return l
        cur = self.snap_dic[index]
        ii = upper_bound(cur, snap_id) #bug1: empty list
        return cur[ii-1][1] if ii >= 1 else 0


# Your SnapshotArray object will be instantiated and called as such:
# obj = SnapshotArray(length)
# obj.set(index,val)
# param_2 = obj.snap()
# param_3 = obj.get(index,snap_id)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值