← All problems

981. Time Based Key Value Store

MediumOpen on LeetCodeProblem statement

Problem Statement

981. Time Based Key-Value Store

Medium


Design a time-based key-value data structure that can store multiple values for the same key at different time stamps and retrieve the key's value at a certain timestamp.

Implement the TimeMap class:

 

Example 1:

Input
["TimeMap", "set", "get", "get", "set", "get", "get"]
[[], ["foo", "bar", 1], ["foo", 1], ["foo", 3], ["foo", "bar2", 4], ["foo", 4], ["foo", 5]]
Output
[null, null, "bar", "bar", null, "bar2", "bar2"]

Explanation
TimeMap timeMap = new TimeMap();
timeMap.set("foo", "bar", 1);  // store the key "foo" and value "bar" along with timestamp = 1.
timeMap.get("foo", 1);         // return "bar"
timeMap.get("foo", 3);         // return "bar", since there is no value corresponding to foo at timestamp 3 and timestamp 2, then the only value is at timestamp 1 is "bar".
timeMap.set("foo", "bar2", 4); // store the key "foo" and value "bar2" along with timestamp = 4.
timeMap.get("foo", 4);         // return "bar2"
timeMap.get("foo", 5);         // return "bar2"

 

Constraints:

C++

Source file
class TimeMap {
public:
    unordered_map <string, vector<pair<int, string>>> m;
    
    // TimeMap() {      // default constructor unnecessary
    //     m.clear();
    // }
    
    void set(string key, string value, int timestamp) {
        m[key].push_back({timestamp, value});
        // All the timestamps `timestamp` of `set` are strictly increasing.  
        // So no need to worry about resetting the value of a already fed timestamp
    }
    
    string get(string key, int timestamp) {
        // Given Constraint: All the timestamps `timestamp` of `set` are strictly increasing.
        // Hence, the vector is already sorted
        auto& v = m[key];
        // Given Constraint: All the timestamps `timestamp` of `set` are strictly increasing.
        // Hence, the vector is already sorted
        auto it = upper_bound(v.begin(), v.end(), pair<int, string>(timestamp, ""), 
                              [](auto& a, auto& b){ return a.first<b.first;});
        // upper_bound => binary search with a special comparator as lambda fx 
        return it==v.begin() ? "" : prev(it)->second;
    }
};

/**
 * 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);
 */