创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作:

1. set(string key, string value, int timestamp)

  • 存储键 key、值 value,以及给定的时间戳 timestamp

2. get(string key, int timestamp)

  • 返回先前调用 set(key, value, timestamp_prev) 所存储的值,其中 timestamp_prev <= timestamp
  • 如果有多个这样的值,则返回对应最大的  timestamp_prev 的那个值。
  • 如果没有值,则返回空字符串("")。

示例 1:

输入:inputs = ["TimeMap","set","get","get","set","get","get"], inputs = [[],["foo","bar",1],["foo",1],["foo",3],["foo","bar2",4],["foo",4],["foo",5]]
输出:[null,null,"bar","bar",null,"bar2","bar2"]
解释:
TimeMap kv;
kv.set("foo", "bar", 1); // 存储键 "foo" 和值 "bar" 以及时间戳 timestamp = 1
kv.get("foo", 1);  // 输出 "bar"
kv.get("foo", 3); // 输出 "bar" 因为在时间戳 3 和时间戳 2 处没有对应 "foo" 的值,所以唯一的值位于时间戳 1 处(即 "bar")
kv.set("foo", "bar2", 4);
kv.get("foo", 4); // 输出 "bar2"
kv.get("foo", 5); // 输出 "bar2"   

示例 2:

输入:inputs = ["TimeMap","set","set","get","get","get","get","get"], inputs = [[],["love","high",10],["love","low",20],["love",5],["love",10],["love",15],["love",20],["love",25]]
输出:[null,null,null,"","high","high","low","low"]

提示:

  1. 所有的键/值字符串都是小写的。
  2. 所有的键/值字符串长度都在 [1, 100] 范围内。
  3. 所有 TimeMap.set 操作中的时间戳 timestamps 都是严格递增的。
  4. 1 <= timestamp <= 10^7
  5. TimeMap.set 和 TimeMap.get 函数在每个测试用例中将(组合)调用总计 120000 次。
#include <iostream>
#include <vector>
#include <tuple>
#include <string>
#include <numeric>
#include <map>using namespace std;//vector<tuple<string, string, int> > vec;
//auto iter = back_inserter(vec);
//vector<pair<string, map<string, int> > > vec;
//auto iter = back_inserter(vec);
//multimap<string, map<string, int> > mun;class TimeMap {
public:TimeMap(){ios_base::sync_with_stdio(false);cin.tie(0);}void set(string key, string value, int timestamp) {mun[key].insert(map<int, string>::value_type(timestamp, value));//存储set()函数的参数值
    }string get(string key, int timestamp) {auto iter = mun[key].upper_bound(timestamp);/*这里使用了二分法,并且这里必须使用upper_bound(),因为题中有“如果有多个这样的值,则返回对应最大的timestamp_prev的那个值。”这个条件iter的位置,恰好是最大值的下一个位置*/return iter == mun[key].end() ? prev(iter)->second : (iter == mun[key].begin() ? "" : prev(iter)->second);/*这里也可以使用 return iter == mun[key].begin() ? "" : prev(iter)->second;  不过个人认为不好理解*//*使用上面这种方法:表示如果在map容器中没有找到不小于timestamp的值,表示map容器中的值都满足题目,则我们只需要取前一位置的值。如果找到了,则我们首先需要判断,找到的位置是不是在map的第一个位置,如果在,则表示map中的元素都不满足题目,则输出""如果不在,表示iter前一位置的值是满足题目的。*/}
private:map<string, map<int, string> > mun;//存储set()函数的map容器
};
int main()
{TimeMap kv;kv.set("foo", "bar", 1); // 存储键 "foo" 和值 "bar" 以及时间戳 timestamp = 1   cout << kv.get("foo", 1) << " ";  // 输出 "bar"   cout << kv.get("foo", 3) << " "; // 输出 "bar" 因为在时间戳 3 和时间戳 2 处没有对应 "foo" 的值,所以唯一的值位于时间戳 1 处(即 "bar")   kv.set("foo", "bar2", 4);cout << kv.get("foo", 4) << " "; // 输出 "bar2"   cout << kv.get("foo", 5) << " "; // 输出 "bar2"
system("PAUSE");return 0;
}

转载于:https://www.cnblogs.com/Mayfly-nymph/p/10547308.html

LeetCode 981.基于时间的键值存储(C++)相关推荐

  1. LeetCode 981. 基于时间的键值存储 / 274. H 指数 / 275. H 指数 II

    981. 基于时间的键值存储 2021.7.10 每日一题 题目描述 创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作:1. set(string key, string value, ...

  2. LeetCode 981. 基于时间的键值存储(哈希+二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作: set(string key, string value, int timestamp ...

  3. 981. 基于时间的键值存储

    创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作: set(string key, string value, int timestamp) 存储键 key.值 value,以及给定的 ...

  4. 文巾解题 981. 基于时间的键值存储

    1 题目描述 . 2 解题思路 创建两个字典,它们有相同的键,键值分别是value和timestamp 然后get的时候,我先用二分查找最大的timestamp_prev的下标,然后用这个下标定位到相 ...

  5. 365天挑战LeetCode1000题——Day 038 公交站间的距离 + 基于时间的键值存储 + 转变数组后最接近目标值的数组和 + 有界数组中指定下标处的最大值

    文章目录 1184. 公交站间的距离 代码实现(自解) 981. 基于时间的键值存储 代码实现(自解) 1300. 转变数组后最接近目标值的数组和 代码实现(自解) 1802. 有界数组中指定下标处的 ...

  6. leetcode981. 基于时间的键值存储(treemap)

    创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作: set(string key, string value, int timestamp) 存储键 key.值 value,以及给定的 ...

  7. 基于LSM-Tree的键值存储引擎的设计与实现

    资源下载地址:https://download.csdn.net/download/sheziqiong/85709667 资源下载地址:https://download.csdn.net/downl ...

  8. 五大存储模型关系模型、键值存储、文档存储、列式存储、图形数据

    五大存储模型关系模型.键值存储.文档存储.列式存储.图形数据 时间:2014-06-12 16:15来源:知行网www.zhixing123.cn 编辑:麦田守望者 昨天跟一同事讨论Sybase是不是 ...

  9. Dynamo:亚马逊的高可用键值存储

    目录 1. 简介 2. 背景 3. 相关工作 4. 系统结构 5. 实现 6. 经验和教训 7. 结论 Dynamo:亚马逊的高可用键值存储 摘要:大规模的可靠性是我们在 Amazon.com 面临的 ...

  10. plsql 存储过程 批量提交_新一代的键值存储 KVell SOSP 2019

    『看看论文』是一系列分析计算机和软件工程领域论文的文章,我们在这个系列的每一篇文章中都会阅读一篇来自 OSDI.SOSP 等顶会中的论文,这里不会事无巨细地介绍所有的细节,而是会筛选论文中的关键内容, ...

最新文章

  1. 从视觉到语言:半监督式学习的大规模实际运用
  2. AC日记——【模板】最小费用最大流 P3381
  3. JAVA程序设计----异常
  4. w7下如何安装linux双系统,ubuntu安装教程(下): 教你装win7+Ubuntu双系统
  5. PWN-PRACTICE-BUUCTF-3
  6. Python基础语法毕业笔记-最简单的添加删除程序
  7. 2048游戏代码python_200 行代码实现简易版 2048 游戏 (python)
  8. pythonnumpy矩阵详解_python常用模块numpy解析(详解)
  9. linux nightshift调整,iOS9.3夜间模式怎么设置?iOS9.3 Night Shift设置教程
  10. python tricks —— datetime 删除日期中的前导 0
  11. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_6_字节输出流写多个字节的方法...
  12. 使用Visual Studio进行单元测试-Part4
  13. 空头平仓什么意思_什么是白糖期货期权仿真交易套利机会?
  14. 机器学习算法LR(logit regression逻辑回归)原理简单解析
  15. matlab模拟光伏发电,一种基于MATLAB的小型独立光伏发电仿真模型的制作方法
  16. PHP配置优化《MordenPHP》
  17. POP3协议与SMTP协议分析(winmail、Wireshark、ubuntu(QT)、foxmail)
  18. Linux 系统中的用户管理
  19. SpringSecurity--记住我
  20. 数据结构(二): 链表篇

热门文章

  1. 【人脸识别】基于matlab GUI SVM和PCA人脸识别【含Matlab源码 369期】
  2. 【语音去噪】基于matlab低通+自适应滤波去噪【含Matlab源码 352期】
  3. 【图像边缘检测】基于matlab GUI Sobel+Prewitt+Robert算子图像边缘检测【含Matlab源码 203期】
  4. 【VRP】基于matlab遗传算法求解多中心的车辆路径规划问题【含Matlab源码 010期】
  5. sql 连接高级语言之后查询出现乱码_还有不会用 SQL 的程序员吗?
  6. 土木工程与计算机专业考研学校排名,2017年土木工程专业考研大学排名
  7. 【BIEE】17_仪表盘提示中值按顺序显示
  8. Nagios中NSClient++监控Windows主机
  9. 《Linux/UNIX OpenLDAP实战指南》——1.2 OpenLDAP目录架构
  10. Laravel 开发笔记