题目描述:
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
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 toset
,snap
, andget
. 0 <= index < length
0 <= snap_id <
(the total number of times we callsnap()
)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;
};