Notes:
This question is pretty straightforward, and it is essentially a question of data structure + binary search. See the code below,
class TimeMap {
public:
/** Initialize your data structure here. */
TimeMap() {
}
void set(string key, string value, int timestamp) {
if(ump.count(key) == 0) ump[key].push_back({timestamp, value});
auto it = upper_bound(ump[key].begin(), ump[key].end(), pair<int, string>(timestamp, ""));
ump[key].insert(it, {timestamp, value});
}
string get(string key, int timestamp) {
if(ump.count(key) == 0) return "";
auto it = upper_bound(ump[key].begin(), ump[key].end(), pair<int, string>(timestamp, ""));
if(it != ump[key].end() && it->first == timestamp) return it->second;
if(it == ump[key].begin()) return "";
return (it-1)->second;
}
private:
unordered_map<string, vector<pair<int, string>>> ump;
};
/**
* Your TimeMap object will be instantiated and called as such:
* TimeMap* obj = new TimeMap();
* obj->set(key,value,timestamp);
* string param_2 = obj->get(key,timestamp);
*/
It should be noticed that inside the upper_bound(), the type of pair has to be written explicitly as pair<int, string>, otherwise compiler error will occur.
Another way using a different structure. Pay attention to the property of map.upper_bound().
int _=[](){//increase run spead ios::sync_with_stdio(false); cin.tie(nullptr); return 0; }(); class TimeMap { public: /** Initialize your data structure here. */ TimeMap() { } void set(string key, string value, int timestamp) { ump[key][timestamp] = value; } string get(string key, int timestamp) { if(ump.count(key) == 0) return ""; auto it = ump[key].upper_bound(timestamp); //find the upper bound of the key of the map... if(it == ump[key].begin()) return ""; return (--it)->second; } private: unordered_map<string, map<int, string>> ump; }; /** * Your TimeMap object will be instantiated and called as such: * TimeMap* obj = new TimeMap(); * obj->set(key,value,timestamp); * string param_2 = obj->get(key,timestamp); */
No comments:
Post a Comment