LeetCode #1146. Snapshot Array

题目描述:

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 setsnap, and get.
  • 0 <= index < length
  • 0 <= snap_id < (the total number of times we call snap())
  • 0 <= val <= 10^9
class SnapshotArray {
public:
    SnapshotArray(int length) {
        id=0;
    }
    
    void set(int index, int val) {
        vector<pair<int,int>>& v=map[index];
        // 需要注意的是对同一个snap_id,可能会做多次set
        // 所以要判断数组末尾的元素是否是同一个id,如果相同要先pop再push,相当于更新
        if(v.size()>0&&v.back().first==id) v.pop_back();
        v.push_back({id,val});
    }
    
    int snap() {
        id++;
        return id-1;
    }
    
    int get(int index, int snap_id) {
        vector<pair<int,int>>& v=map[index];
        if(v.size()==0) return 0;
        pair<int,int> p={snap_id,-1};
        int i=lower_bound(v.begin(),v.end(),p)-v.begin();
        if(i==v.size()) return v.back().second;
        else
        {
            if(v[i].first==snap_id) return v[i].second;
            else return i==0?0:v[i-1].second;
        }
    }
    
private:    
    unordered_map<int,vector<pair<int,int>>> map;
    int id;
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值