[二分法]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;
    }
};
发布了512 篇原创文章 · 获赞 175 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/104074623