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

创建一个基于时间的键值存储类TimaMap,它支持下面两个操作:

1、set(string key,string value,int timestamp)

  • 存储键key、值value,以及给定的时间戳timestamp

2、get(string key,int timestamp)

  • 返回先前调用set(key,value,timestamp)所存储的值,其中timestamp_prev <= timestamp
  • 如果有多个这样的值,则返回对应的最大的timestamp的那个值
  • 如果没有值,则返回空字符串(" ")。

示例1:

输入:inputs = ["TimeMap","set","get","get","set","get","get"],inputs=[[],["foo","bar","1"],["foo","1"],["foo","3"],["foo","bar2","4"],["foo","4"],["foo","5"]]

输出:[null,null,"bar","bar",null,"bar2","bar2"]

解题思路

首先本题要存放键值对,首先想到要使用map,其次对于一个key可以存放多个不同的value和时间戳,所以需要建立一个包含string和int型变量的结构node,然后建立<string,vector<node>>型map

struct node{
	string value;
	int timestamp;
	node(string _value,int _tmp):value(_value),timestamp(_tmp){}
	friend bool operator<(node a,node b){
		return a.timestamp < b.timestamp;
	}
};
class TimeMap {
public:
    /** Initialize your data structure here. */
    TimeMap() {
        
    }
    
    void set(string key, string value, int timestamp) {
        map<string,vector<node> >::iterator it;
			it = mp.find(key);
			if(it != mp.end()){
				mp[key].push_back(node(value,timestamp));
			}else{
				vector<node> vect;
				vect.push_back(node(value,timestamp));
				mp[key] = vect;
			}
    }
    
    string get(string key, int timestamp) {
        map<string,vector<node> >::iterator it;
			it = mp.find(key);
			if(it != mp.end() && it->second[0].timestamp <= timestamp){
				vector<node>::iterator itt;
				itt = lower_bound(it->second.begin(),it->second.end(),node(" ",timestamp));
				if(itt != it->second.end()){
					if(itt->timestamp == timestamp) return itt->value;
					itt--;
					return itt->value;
				}
				return it->second[it->second.size()-1].value;
			}
			return "";
    }
    private:
		map<string,vector<node> > mp;
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值