[二分法]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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章