[MSTL] lc981. 基于时间的键值存储(设计+哈希表+map二分查找+代码技巧)
Posted Ypuyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[MSTL] lc981. 基于时间的键值存储(设计+哈希表+map二分查找+代码技巧)相关的知识,希望对你有一定的参考价值。
1. 题目来源
2. 题目解析
表套表解决。
map<string, map<int, string, greater<int>>> mp;
key, time, value 这里使用了 map
的第三个参数,使 time
降序排。
貌似外部的不需要使用有序 map
…
由于本题 time
是严格递增给出的,所以直接使用 map
存即可,如果存在多个重复值的话,会用到 vector
或者 set
。
map
可以针对 key
进行 upper_bound
,严格 <
,然后迭代器 --
即可找到第一个大于等于的位置。迭代器 --
之前需要判断是否为 begin
。
时间复杂度:
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
空间复杂度:
O
(
n
)
O(n)
O(n)
有序 map
+ greater
参数:
class TimeMap {
public:
/** Initialize your data structure here. */
map<string, map<int, string, greater<int>>> mp;
TimeMap() {
}
void set(string key, string value, int timestamp) {
mp[key][timestamp] = value;
}
string get(string key, int timestamp) {
if (mp.count(key) == 0) return "";
else {
for (auto &[k, v] : mp[key]) {
if (timestamp >= k)
return v;
}
}
return "";
}
};
哈希表+有序 map
+ 二分查找:
map
可以针对 key
进行 upper_bound
,严格 <
,然后迭代器 --
即可找到第一个大于等于的位置。迭代器 --
之前需要判断是否为 begin
。
class TimeMap {
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;
}
string get(string key, int timestamp) {
if(m.find(key) == m.end()) return "";
auto it = m[key].upper_bound(timestamp); // map,key有序,二分查找
if(it == m[key].begin()) return ""; // 没找到
return (--it)->second;
}
};
以上是关于[MSTL] lc981. 基于时间的键值存储(设计+哈希表+map二分查找+代码技巧)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 981 基于时间的键值存储[Map] HERODING的LeetCode之路