首页 > 其他分享 >Leetcode 981. 基于时间的键值存储

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

时间:2024-09-30 10:25:10浏览次数:1  
标签:tMap 哈希 timestamp self 981 value 键值 key Leetcode

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即为r
        tArr=self.tMap[key][0]
        length=len(tArr)
        left,right=-1,length
        while left+1<right:
            mid=(right-left)//2+left
            if tArr[mid]<=timestamp:
                left=mid
            else:
                right=mid
        return "" 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.执行结果

在这里插入图片描述

标签:tMap,哈希,timestamp,self,981,value,键值,key,Leetcode
From: https://www.cnblogs.com/geek0070/p/18441313

相关文章

  • Leetcode 875. 爱吃香蕉的珂珂
    1.题目基本信息1.1.题目描述珂珂喜欢吃香蕉。这里有n堆香蕉,第i堆中有piles[i]根香蕉。警卫已经离开了,将在h小时后回来。珂珂可以决定她吃香蕉的速度k(单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉k根。如果这堆香蕉少于k根,她将吃掉这堆的所有香蕉,然后这一小......
  • 【leetcode】169.多数元素
    boyer-moore算法最简单理解方法:假设你在投票选人如果你和候选人(利益)相同,你就会给他投一票(count+1),如果不同,你就会踩他一下(count-1)当候选人票数为0(count=0)时,就换一个候选人,但因为和你利益一样的人占比超过了一半不论换多少次,最后留下来的都一定是个和你(利益)相同的人。代码:......
  • C语言 | Leetcode C语言题解之第445题两数相加II
    题目:题解:structListNode*addTwoNumbers(structListNode*l1,structListNode*l2){intstack1[100];intstack2[100];inttop1=0;inttop2=0;intcarry=0;intsum=0;structListNode*temp=NULL;structListNode*he......
  • C语言 | Leetcode C语言题解之第443题压缩字符串
    题目:题解:voidswap(char*a,char*b){chart=*a;*a=*b,*b=t;}voidreverse(char*a,char*b){while(a<b){swap(a++,--b);}}intcompress(char*chars,intcharsSize){intwrite=0,left=0;for(intr......
  • C++ | Leetcode C++题解之第445题两数相加II
    题目:题解:classSolution{public:ListNode*addTwoNumbers(ListNode*l1,ListNode*l2){stack<int>s1,s2;while(l1){s1.push(l1->val);l1=l1->next;}while(l2){......
  • C++ | Leetcode C++题解之第443题压缩字符串
    题目:题解:classSolution{public:intcompress(vector<char>&chars){intn=chars.size();intwrite=0,left=0;for(intread=0;read<n;read++){if(read==n-1||chars[read]!=chars[read......
  • [leetcode]647_回文子串
    给你一个字符串s,请你统计并返回这个字符串中回文子串的数目。回文字符串是正着读和倒过来读一样的字符串。子字符串是字符串中的由连续字符组成的一个序列。示例1:输入:s="abc"输出:3解释:三个回文子串:"a","b","c"示例2:输入:s="aaa"输出:6解释:6个回文子......
  • [leetcode]516_最长回文子序列
    给你一个字符串s,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例1:输入:s="bbbab"输出:4解释:一个可能的最长回文子序列为"bbbb"。示例2:输入:s="cbbd"输出:2解释:一个......
  • [leetcode]53_最大子数组(序列)和
    给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入:[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。示例2:输入:nums=[1]输出:1示例3:输入:nums=[5,4,-1,7,8]输出:23提示:1<=......
  • 【LeetCode Hot 100】22. 括号生成
    题目描述要求生成所有“合法”的括号字符串,就首先需要弄清楚括号字符串的合法性定义,也就是说如果我们现在有一个由小括号组成的字符串,该如何判断其是否符合要求。此前做过判断括号串是否合法的题目,那道题目中一般在遍历过程中维护一个栈,因为每个后括号都需要在已经遍历的子串中找......