1146. 快照数组
思考:难点就是在怎么找到snap_id时,index下标对应的值。我们可以先用哈希表mp存储每次更新时的snap_id和val,然后查找时用二分即可。
class SnapshotArray {
public:
vector<int> v;
vector<pair<int,int>> mp[50010];
int top=0;
SnapshotArray(int length) {
v.assign(length,0);
}
void set(int index, int val) {
v[index]=val;
mp[index].push_back({top,val});//储每次更新时的snap_id和val
}
int snap() {
return top++;
}
int get(int index, int snap_id) {
if(mp[index].size()==0) return 0;
int l=0,r=mp[index].size()-1;
while(l<r){//二分查找,找到比snap_id值大的前一个下标
int mid=(l+r+1)/2;
if(mp[index][mid].first<=snap_id) l=mid;
else r=mid-1;
}
//这里加了一个<的原因是:在snap_id及之前的时候,下标index对应的值可能没有进行更新
//故只需要沿用数组中最新的值mp[index][l].second即可。
if(mp[index][l].first<=snap_id) return mp[index][l].second;
else return 0;
}
};
/**
* Your SnapshotArray object will be instantiated and called as such:
* SnapshotArray* obj = new SnapshotArray(length);
* obj->set(index,val);
* int param_2 = obj->snap();
* int param_3 = obj->get(index,snap_id);
*/