題目:
題解:
- 二分法:尋找小於等於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;
}
};