[二分法]leetcode981:基于时间的键值存放(mudium)

题目:

981. 基于时间的键值存储

题解:

  • 二分法:寻找小于等于x的最大值,可以转换为寻找大于x的最小值,这样大于x的最小值的前一个就是小于等于x的最大值了。
  • 思路:将<key,val,time>存在放一个unordered_map<string,map<int,string>>map中,在get(key,timestamp)使用map的二分查找函数upper_bound来寻找大于x的最小值,若最小值的位置为第一个元素的位置,表示小于等于x的位置不存在,那么我们应该返回空字符串;否则,我们就返回最小值位置的前一个位置的字符串。

代码如下:

class TimeMap {
private:
    unordered_map<string,map<int,string>> m;
public:
    /** Initialize your data structure here. */
    TimeMap() {
        
    }
    
    void set(string key, string value, int timestamp) {
        m[key][timestamp]=value;
    }
    
    //二分法:求小于等于x的最大值res1,转换为求大于x的最小值res2,然后res2-1=res1为最大值
    string get(string key, int timestamp) {
        auto& myMap=m[key];
        //二分求出大于timestamp的最小值,若大于timestamp的最小值为第一个时间,那么应该返回空字符串;若不为第一个时间,那么返回前一个时间的value,转换为小于等于x的最大值了
        auto it=myMap.upper_bound(timestamp);
        return it==myMap.begin()?"":prev(it)->second;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章