题目:
题解:
- 二分法:寻找小于等于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;
}
};