1. 题意
对一个数组进行多次修改,然后照一个快照。
再对数组进行询问第k
次快照时的index
处的值。
2. 题解
哈希表 + 二分
对于每个位置,我们只需要顺序记录这个位置更改的快照和时间和值即可;
再通过二分查找来获取它的值。我的代码
class SnapshotArray {
private:
// index snap_cnt val
unordered_map<int, vector< pair<int,int>> > mem;
int snap_cnt;
public:
SnapshotArray(int length):snap_cnt(0){
}
void set(int index, int val) {
if ( mem.find( index ) == mem.end() ) {
vector< pair<int,int>> tmp;
mem[ index ] = tmp;
}
if ( mem[ index ].empty()) {
mem[ index ].push_back({snap_cnt, val});
}
else {
int sz = mem[ index ].size();
if ( mem[index][sz - 1].first != snap_cnt) {
mem[ index ].push_back({snap_cnt, val});
}
else {
mem[index][sz - 1].second = val;
}
}
}
int snap() {
snap_cnt++;
return snap_cnt - 1;
}
int get(int index, int snap_id) {
if ( mem.find( index ) == mem.end() )
return 0;
pair<int,int> p(snap_id, 0);
auto low = lower_bound( mem[index].begin(), mem[index].end(), p,
[](const pair<int,int> &a, const pair<int,int> &b){
return a.first < b.first;
} );
int sz = mem[ index ].size();
if ( low == mem[index].end())
return mem[ index ][ sz - 1 ].second;
if ( low == mem[ index ].begin() && snap_id < low->first)
return 0;
if ( low->first == snap_id)
return low->second;
else {
return (low - 1)->second;
}
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);
*/
- 使用
upper_bound
class SnapshotArray {
private:
// index snap_cnt val
unordered_map<int, vector<pair<int, int>>> mem;
int snap_cnt;
public:
SnapshotArray(int length) : snap_cnt(0) {}
void set(int index, int val) {
// if ( mem.find( index ) == mem.end() ) {
// vector< pair<int,int>> tmp;
// mem[ index ] = tmp;
// }
// if ( mem[ index ].empty()) {
// mem[ index ].push_back({snap_cnt, val});
// }
// else {
// int sz = mem[ index ].size();
// if ( mem[index][sz - 1].first != snap_cnt) {
// mem[ index ].push_back({snap_cnt, val});
// }
// else {
// mem[index][sz - 1].second = val;
// }
// }
mem[index].emplace_back(snap_cnt, val);
}
int snap() {
snap_cnt++;
return snap_cnt - 1;
}
int get(int index, int snap_id) {
pair<int, int> p(snap_id, 0);
auto low =
upper_bound(mem[index].begin(), mem[index].end(), p,
[](const pair<int, int>& a, const pair<int, int>& b) {
return a.first < b.first;
});
return low == mem[index].begin() ? 0 : (low - 1)->second;
}
};
/**
* 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);
*/