Leetcode 981. Time Based Key-Value Store(二分查找)

题目来源: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是解……

代码

1234567891011121314151617181920212223242526272829
大专栏  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;    }};

原文地址:https://www.cnblogs.com/lijianming180/p/12239993.html

时间: 2024-11-06 21:26:13

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

leetcode 69.x的平方根(Java 二分查找 easy)

https://leetcode-cn.com/problems/sqrtx/ 实现int sqrt(int x)函数,给定一个数字,求sqrt(x)并且保留整数部分. 二分查找,令l=1,h=x,判断l<=h,当跳出循环时,即sqrt(x)不为整数时,return h,因为跳出循环时l>h,本题要求只保留整数部分,不四舍五入. class Solution { public int mySqrt(int x) { if(x<=1) return x; int l=1,h=x; whil

Leetcode 4 Median of Two Sorted Arrays 二分查找(二分答案)

貌似是去年阿里巴巴c++的笔试题,没有什么创新直接照搬的... 题意就是找出两个排序数组的中间数,其实就是找出两个排序数组的第k个数. 二分答案,先二分出一个数,再用二分算出这个数在两个排序数组排序第几,然后和k做比较,最后以这个比较为依据接着二分直到求出第k个数. 本来这是两重二分,由于楼主的懒已经没有办法治疗了,用库函数upper_bound()代替了第二重二分,有志者可以自己写第二重二分,楼主就偷懒了... 警告:由于题目很神奇,会出现两个排序数组为空的情况,楼主差点因为这个报警....

[LeetCode] 240. 搜索二维矩阵 II ☆☆☆(二分查找类似)

描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列.每列的元素从上到下升序排列.示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回 true. 给定 target = 20,返回 f

LeetCode 240. 搜索二维矩阵 II (C#实现)——二分查找,分治法

问题:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/ 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18,

LeetCode 33. 搜索旋转排序数组(C#实现)——二分查找

问题:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/submissions/ 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 . 你可以假设数组中不存在重复的元素. 你的算法时间复杂度必须是 O(log n) 级别. 示例 1: 输入

二分查找原理和实现

前言 的确,我一开始的时候也认为二分查找挺简单的,但是在我对二分查找进行总结的时候,发现虽然思路很简单,但是代码要写的正确就不容易了. 区间 需要注意的是 注意计算的区间是左闭右开区间[)还是左闭右闭区间[],两者的代码是不太一样的. 左闭右闭区间 如果说你使用的是左闭右闭区间: int search3(int array[], int n, int target) { int left = 0; int right = n - 1; //比如说只有一个情况下 while (left <= ri

Java实现二分查找

public class BinarySearch { /** * 二分查找算法 * * @param srcArray 有序数组 * @param key 查找元素 * @return key的数组下标,没找到返回-1 */ public static void main(String[] args) { int srcArray[] = {3,5,11,17,21,23,28,30,32,50,64,78,81,95,101}; System.out.println(binSearch(sr

二分查找算法java

二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.通过一次比较,将查找区间缩小一半. 折半查找是一种高效的查找方法.它可以明显减少比较次数,提高查找效率.但是,折半查找的先决条件是查找表中的数据元素必须有序. 折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除

Java二分查找算法

二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.通过一次比较,将查找区间缩小一半. 折半查找是一种高效的查找方法.它可以明显减少比较次数,提高查找效率.但是,折半查找的先决条件是查找表中的数据元素必须有序. 折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除