具体思路:
二分还是有时候有问题,最好画个图看看;
当在一个有序序列中寻找不大于某个值得最大值时,可能会有问题;
[1,2,4,6,7]
如果寻找7,则全部符合,返回最大值;
如果寻找5,则注意收缩左边界不能l=mid,这种情况应该是列表中存在需要寻找的值;
应该直接l=mid+1,让他找到本应该出现的位置上;
具体代码:
class TimeMap {
public:
TimeMap() {
}
void set(string key, string value, int timestamp) {
ump[key].push_back({timestamp,value});
}
string get(string key, int timestamp) {
if(!ump.count(key))
return "";
int l=0,r=ump[key].size()-1;
if(timestamp>=ump[key][r].first)
return ump[key][r].second;
while(l<r){
int mid=l+(r-l)/2;
if(ump[key][mid].first>timestamp){
r=mid-1;
}else if(ump[key][mid].first==timestamp){
return ump[key][mid].second;
}else{
l=mid+1;
}
}
if(l==0)
return "";
return ump[key][l-1].second;
}
unordered_map<string,vector<pair<int,string>>>ump;
};
/**
* Your TimeMap object will be instantiated and called as such:
* TimeMap* obj = new TimeMap();
* obj->set(key,value,timestamp);
* string param_2 = obj->get(key,timestamp);
*/