题目来源:https://leetcode.com/problems/time-based-key-value-store/description/

标记难度:Medium

提交次数:1/1

代码效率:33.33%(212ms)

题意

给定一系列set和get操作,其中:

  • 每个set操作包含一个key,一个value和一个timestamp,其中timestamp是严格递增的
  • 每个get操作包含一个key和一个timestamp,要求找出与这个key相等且时间戳<=timestamp的set操作中时间戳最大的set对应的value

所有操作总数不超过12万次。

分析

这个题目咋一看很唬人,其实完全不是那么回事。解题思路很简单:

  • 用一个map维护set操作的key对应的value和timestamp对的列表
  • 对于每个get操作,从key对应的列表中通过二分查找,找到最大的符合要求的timestamp对应的value

如果map用的是Hash Table,记总操作次数为N,那么set的复杂度是O(1),get的复杂度是O(log(N));如果用的是树结构的话,那set的复杂度就是O(log(N)),get的复杂度是O(log^2(N))(不过显然可以把它写得更好一些)。

这次我写了二分查找。一般来说,如果二分查找(m = (l + r) / 2)之后的转移条件是l = m + 1r = m的话,那循环条件就可以写成l < r;但是如果转移条件是l = mr = m - 1的话,循环条件就需要写成l < r-1,然后判断l还是r是解……

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
大专栏  Leetcode 981. Time Based Key-Value Store(二分查找)"class">class  {
private:
map<string, vector<pair<int, string>>> mmap; public:
TimeMap() { } void set(string key, string value, int timestamp) {
mmap[key].emplace_back(timestamp, value);
} string get(string key, int timestamp) {
if (mmap.find(key) == mmap.end()) return "";
int n = mmap[key].size();
if (mmap[key][0].first > timestamp) return ""; int l = 0, r = n - 1;
while (l < r - 1) {
int m = (l + r) / 2;
if (mmap[key][m].first <= timestamp) l = m;
else
r = m - 1;
}
if (mmap[key][r].first <= timestamp) return mmap[key][r].second;
return mmap[key][l].second;
}
};

Leetcode 981. Time Based Key-Value Store(二分查找)的更多相关文章

  1. [LeetCode] 74 Search a 2D Matrix(二分查找)

    二分查找 1.二分查找的时间复杂度分析: 二分查找每次排除掉一半不合适的值,所以对于n个元素的情况来说: 一次二分剩下:n/2 两次:n/4 m次:n/(2^m) 最坏情况是排除到最后一个值之后得到结 ...

  2. LeetCode 981. Time Based Key-Value Store

    原题链接在这里:https://leetcode.com/problems/time-based-key-value-store/ 题目: Create a timebased key-value s ...

  3. Leetcode 4 Median of Two Sorted Arrays 二分查找(二分答案+二分下标)

    貌似是去年阿里巴巴c++的笔试题,没有什么创新直接照搬的... 题意就是找出两个排序数组的中间数,其实就是找出两个排序数组的第k个数. 二分答案,先二分出一个数,再用二分算出这个数在两个排序数组排序第 ...

  4. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  5. CF 600B Queries about less or equal elements --- 二分查找

    CF 600B 题目大意:给定n,m,数组a(n个数),数组b(m个数),对每一个数组b中的元素,求数组a中小于等于数组该元素的个数. 解题思路:对数组a进行排序,然后对每一个元素b[i],在数组a中 ...

  6. 二分查找算法java

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元 ...

  7. 【LeetCode】981. Time Based Key-Value Store 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcod ...

  8. 【leetcode】981. Time Based Key-Value Store

    题目如下: Create a timebased key-value store class TimeMap, that supports two operations. 1. set(string ...

  9. [LeetCode] #1# Two Sum : 数组/哈希表/二分查找/双指针

    一. 题目 1. Two SumTotal Accepted: 241484 Total Submissions: 1005339 Difficulty: Easy Given an array of ...

随机推荐

  1. 计量经济与时间序列_滞后算子和超前算子L的定义

    1.   为了使计算简单,引入滞后算子的概念: 2.   定义LYt = Yt-1 , L2Yt = Yt-2,... , LsYt = Yt-s. 3.   也就是把每一期具体滞后哪一期的k提到L的 ...

  2. 十大经典排序算法(Javascript实现)

    前言 总括: 本文结合动图详细讲述了十大经典排序算法用Javascript实现的过程. 原文博客地址:十大经典排序算法 公众号:「菜鸟学前端」,回复「666」,获取一揽子前端技术书籍 人生有情泪沾衣, ...

  3. drf三大认证补充

    频率认证 源码分析部分 def check_throttles(self, request): for throttle in self.get_throttles(): if not throttl ...

  4. Windows 常用配置 - 启用长路径

    Windows 启用长路径支持 打开注册表编辑器:regedit 找到如下路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSyte ...

  5. E. Arson In Berland Forest(思维,找二维阵列中的矩阵,二分)

    题:https://codeforces.com/contest/1262/problem/E 分析:预处理出阵列中的矩阵,然后二分答案还原题目的烧火过程,判断是否满足要求 #include<b ...

  6. c语言中对字段宽度的理解?

    /************************************************************************* > File Name: printf.c ...

  7. 静态、动态cell区别

    静态cell:cell数目固定不变,图片/文字固定不变(如qq设置列表可使用静态cell加载) 动态cell:cell数目较多,且图片/文字可能会发生变化(如应网络请求,淘宝列表中某个物品名称或者图片 ...

  8. RDD(十)——案例实操

    需求: 数据结构:时间戳,省份,城市,用户,广告,中间字段使用空格分割. 样本如下: 1516609143867 6 7 64 16 1516609143869 9 4 75 18 151660914 ...

  9. 关于ping命令的批处理问题

    需求描述:假设你的IP保存在名字为IP.txt的文本文档里,且每行一条ip.你想ping这些IP并得到结果 解决方案:用下面的批处理代码即可实现,将下面的代码保存为后缀为.bat的文件,比如test. ...

  10. C. 小花梨判连通

    https://acm.ecnu.edu.cn/contest/173/problem/C/ 联通块染色,若i,j满足题目中的条件,那么他们在每幅图中的染色情况相同,即hash值相同 使用unsign ...