题目来源: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. js 经纬度计算直线距离

    function getRad(d) { var PI = Math.PI; return d * PI / 180.0; } function getDistance(lat1, lng1, lat ...

  2. HDU 1257最少拦截系统[动态规划]

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1257                                                 最 ...

  3. Spring和MyBatis的集成

    Spring和MyBatis的整合   1. Spring和各个框架的整合 Spring目前是JavaWeb开发中最终的框架,提供一站式服务,可以其他各个框架整合集成 Spring整合方案 1.1.  ...

  4. 14 微服务电商【黑马乐优商城】:day06-使用nginx反向代理并掌握cors解决跨域

    本项目的笔记和资料的Download,请点击这一句话自行获取. day01-springboot(理论篇) :day01-springboot(实践篇) day02-springcloud(理论篇一) ...

  5. Uncaught TypeError: Cannot read property 'querySelector' of null

    报错. 解决办法:把报错部分的js放到body后面

  6. 二分法C++与Python

    来源于Leetcode C++ int binarySearch(vector<int>& nums, int target){ if(nums.size() == 0) retu ...

  7. python之接口开发

    一.接口开发的思路 1.启动一个服务: 2.接受客户端传过来的数据: 3.登录,注册,支付等功能 4.操作数据库,拿到数据: 5.返回数据: import flask server=flask.Fla ...

  8. [LC] 108. Convert Sorted Array to Binary Search Tree

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...

  9. [LC] 121. Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  10. JS替换变量中的文字字母

    var text='Hello world, Hello world'; var b= text.replace('world','zhengxiaoya'); // 找到字符串中的第一个'world ...