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

news/2024/9/30 10:23:51

1.题目基本信息

1.1.题目描述

设计一个基于时间的键值数据结构,该结构可以在不同时间戳存储对应同一个键的多个值,并针对特定时间戳检索键对应的值。

实现 TimeMap 类:

  • TimeMap() 初始化数据结构对象
  • void set(String key, String value, int timestamp) 存储给定时间戳 timestamp 时的键 key 和值 value。
  • String get(String key, int timestamp) 返回一个值,该值在之前调用了 set,其中 timestamp_prev <= timestamp 。如果有多个这样的值,它将返回与最大 timestamp_prev 关联的值。如果没有值,则返回空字符串("")。

1.2.题目地址

https://leetcode.cn/problems/time-based-key-value-store/description/

2.解题方法

2.1.解题思路

数据结构设计+哈希表+二分查找

2.2.解题步骤

第一步,设计存储数据结构tMap并构建set函数,这里采用哈希表设计存储结构,键为传入的key,值为二维数组arr,arr[0]记录timestamp,arr[1]记录传入的value值。

第二步,构建get函数,如果key不在哈希表中,直接返回空字符串;如果存在key关键字,则获取tMap[key][0],即key对应的所有时间戳数组,这个时间戳数组一定是升序排列的,所以可以采用二分查找的方法。需要找到最后一个小于等于timestamp的索引r,其对应的值即为最终结果,该值也可能不存在,即r=-1,使用二分查找的红蓝染色法(左开右开区间)很容易可以获取r的值,最终如果r=-1,则返回空字符串,否则返回tMap[key][1][r],即r对应的值。

3.解题代码

Python代码

# 数据结构设计+哈希表+二分查找
# 第一步,设计存储数据结构tMap并构建set函数,这里采用哈希表设计存储结构,键为传入的key,值为二维数组arr,arr[0]记录timestamp,arr[1]记录传入的value值。
# 第二步,构建get函数,如果key不在哈希表中,直接返回空字符串;如果存在key关键字,则获取tMap[key][0],即key对应的所有时间戳数组,这个时间戳数组一定是升序排列的,所以可以采用二分查找的方法。需要找到最后一个小于等于timestamp的索引r,其对应的值即为最终结果,该值也可能不存在,即r=-1,使用二分查找的红蓝染色法(左开右开区间)很容易可以获取r的值,最终如果r=-1,则返回空字符串,否则返回tMap[key][1][r],即r对应的值。
class TimeMap:def __init__(self):self.tMap={}def set(self, key: str, value: str, timestamp: int) -> None:if key not in self.tMap:self.tMap[key]=[[timestamp],[value]]else:self.tMap[key][0].append(timestamp)self.tMap[key][1].append(value)def get(self, key: str, timestamp: int) -> str:if key not in self.tMap:return ""# 找最后一个小于等于timestamp的索引r,该值可能不存在# 红:小于等于timestamp,蓝:大于timestamp;left:指向红色,right:指向蓝色;最终的left即为rtArr=self.tMap[key][0]length=len(tArr)left,right=-1,lengthwhile left+1<right:mid=(right-left)//2+leftif tArr[mid]<=timestamp:left=midelse:right=midreturn "" if left==-1 else self.tMap[key][1][left]# Your TimeMap object will be instantiated and called as such:
# obj = TimeMap()
# obj.set(key,value,timestamp)
# param_2 = obj.get(key,timestamp)

4.执行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66432.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

pbootcms模板如何修改后台版权

你在 PbootCMS 中修改 home.html 文件的内容,包括文字和链接。 步骤登录FTP或宝塔服务器登录到你的FTP客户端或宝塔面板。找到网站目录寻找网站根目录下的 APPs\admin\view\default\system 目录。定位 home.html 文件在 system 目录中找到 home.html 文件。修改 home.html 文件…

pbootcms模板导航设置外链时新窗口打开

要在 PbootCMS 中设置导航链接并在新窗口中打开外部链接,可以使用以下方法。具体步骤如下:修改导航标签 添加条件判断示例代码 以下是完整的示例代码,展示了如何在导航链接中添加条件判断,以便在新窗口中打开外部链接:{pboot:nav}<a href="[nav:link]" {pboo…

【解题报告】P8477 「GLR-R3」春分

P8477 「GLR-R3」春分 题目看起来比较魔怔,考虑怎么搞一下。 首先,一个最简单的想法,每对溶液组都配一个板子,可以用 \(n^2\) 个板子解决,看得出来很不优啊,但是可以得到 Sub1 的分数。 节俭一点,我们如果把每个板子都拿出来一面用来对应一种溶液,此时就可以拼起来,只…

PbootCMS百度编辑器ueditor在PHP7下多图上传名字重复问题

针对百度编辑器UEditor在PHP 7环境下多图上传名字重复的问题,PbootCMS V1.3.8 已经进行了修复。以下是具体的修改步骤和详细说明,供遇到类似问题的开发者参考: 修改步骤修改 /ueditor/dialogs/attachment/attachment.js 文件 将 _this.fileList.push(json); 修改为:javascr…

OpenGauss 安装

参考官网链接:https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/InstallationGuide/%E5%8D%95%E8%8A%82%E7%82%B9%E5%AE%89%E8%A3%85.html 其中安装版本为 5.0,操作系统为 openEuler 22 1、创建用户(gauss数据库的安装必须要在普通用户下面)useradd -m gauss  #创建…

pbootcms模板指定栏目标签调用

在PbootCMS中,通过自定义标签来调用指定栏目的功能非常实用,尤其是在构建导航菜单或特定页面布局时。以下是如何使用这些标签的一些示例和说明: 指定栏目标签的基本结构{pboot:sort scode=*}[sort:name] {/pboot:sort}控制参数解释scode=*: 必填参数,用于指定要显示的栏目编…

Ovis1.6-9B视觉大模型环境搭建推理

引子 前阵子,阿里Qwen2-VL刚刚闪亮登场,感兴趣的小伙伴可以移步https://blog.csdn.net/zzq1989_/article/details/142332651?spm=1001.2014.3001.5501。这第一的宝座还没坐多久,自家兄弟Ovis1.6版本就来了,20240919阿里国际AI团队开源多模态大模型Ovis1.6。在多模态权威综…

通过NandGame网站学习选择器

1.选择器 选择器元件选择两个输入中的一个作为输出。 s为选择比特,决定选择哪个输入: 为0时,选择d0;为1时,选择d1。2.开关 开关元件将数据比特送到2个输出之一。 s(选择位)决定d(数据位)是从c1还是c0输出。 电路描述:输入信号:选择位 ( s ) 和数据位 ( d )。 非门:对 (…