981. Time Based Key-Value Store
https://leetcode.com/problems/time-based-key-value-store/
Create a timebased key-value store class TimeMap
, that supports two operations.
1. set(string key, string value, int timestamp)
- Stores the
key
andvalue
, along with the giventimestamp
.
2. get(string key, int timestamp)
- Returns a value such that
set(key, value, timestamp_prev)
was called previously, withtimestamp_prev <= timestamp
. - If there are multiple such values, it returns the one with the largest
timestamp_prev
. - If there are no values, it returns the empty string (
""
).
Example 1:
Input: inputs = ["TimeMap","set","get","get","set","get","get"], inputs = [[],["foo","bar",1],["foo",1],["foo",3],["foo","bar2",4],["foo",4],["foo",5]] Output: [null,null,"bar","bar",null,"bar2","bar2"] Explanation: TimeMap kv; kv.set("foo", "bar", 1); // store the key "foo" and value "bar" along with timestamp = 1 kv.get("foo", 1); // output "bar" kv.get("foo", 3); // output "bar" since there is no value corresponding to foo at timestamp 3 and timestamp 2, then the only value is at timestamp 1 ie "bar" kv.set("foo", "bar2", 4); kv.get("foo", 4); // output "bar2" kv.get("foo", 5); //output "bar2"
Example 2:
Input: inputs = ["TimeMap","set","set","get","get","get","get","get"], inputs = [[],["love","high",10],["love","low",20],["love",5],["love",10],["love",15],["love",20],["love",25]] Output: [null,null,null,"","high","high","low","low"]
Note:
- All key/value strings are lowercase.
- All key/value strings have length in the range
[1, 100]
- The
timestamps
for allTimeMap.set
operations are strictly increasing. 1 <= timestamp <= 10^7
TimeMap.set
andTimeMap.get
functions will be called a total of120000
times (combined) per test case.
---
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Pair { | |
Integer timestamp; | |
String value; | |
public Pair(int t, String v) { | |
timestamp = t; | |
value = v; | |
} | |
} | |
class TimeMap { | |
Map<String, List<Pair>> map; | |
/** Initialize your data structure here. */ | |
public TimeMap() { | |
map = new HashMap<String, List<Pair>>(); | |
} | |
public void set(String key, String value, int timestamp) { | |
map.putIfAbsent(key, new ArrayList<Pair>()); | |
map.get(key).add(new Pair(timestamp, value)); | |
} | |
public String get(String key, int timestamp) { | |
if (!map.containsKey(key) || timestamp < map.get(key).get(0).timestamp) { | |
return ""; | |
} | |
List<Pair> list = map.get(key); | |
int lo = 0, hi = list.size() - 1; | |
String ans = ""; | |
while (lo <= hi) { | |
int mid = lo + (hi - lo) / 2; | |
int t = list.get(mid).timestamp; | |
if (t == timestamp) { | |
return list.get(mid).value; | |
} | |
if (t < timestamp) { | |
ans = list.get(mid).value; | |
lo = mid + 1; | |
} else { | |
hi = mid - 1; | |
} | |
} | |
return ans; | |
} | |
} | |
/** | |
* Your TimeMap object will be instantiated and called as such: | |
* TimeMap obj = new TimeMap(); | |
* obj.set(key,value,timestamp); | |
* String param_2 = obj.get(key,timestamp); | |
*/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class TimeMap { | |
Map<String, TreeMap<Integer, String>> map; | |
/** Initialize your data structure here. */ | |
public TimeMap() { | |
map = new HashMap<String, TreeMap<Integer, String>>(); | |
} | |
public void set(String key, String value, int timestamp) { | |
map.putIfAbsent(key, new TreeMap<Integer, String>()); | |
map.get(key).put(timestamp, value); | |
} | |
public String get(String key, int timestamp) { | |
if (!map.containsKey(key) || map.get(key).floorKey(timestamp) == null) { | |
return ""; | |
} | |
return map.get(key).get(map.get(key).floorKey(timestamp)); | |
} | |
} | |
/** | |
* Your TimeMap object will be instantiated and called as such: | |
* TimeMap obj = new TimeMap(); | |
* obj.set(key,value,timestamp); | |
* String param_2 = obj.get(key,timestamp); | |
*/ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class TimeMap: | |
def __init__(self): | |
self.map = {} | |
def set(self, key: str, value: str, timestamp: int) -> None: | |
if not key in self.map: | |
self.map[key] = [] | |
self.map[key].append((timestamp, value)) | |
def get(self, key: str, timestamp: int) -> str: | |
if not key in self.map or timestamp < self.map[key][0][0]: | |
return "" | |
list = self.map[key] | |
lo = 0 | |
hi = len(list) - 1 | |
ans = "" | |
while lo <= hi: | |
mid = (hi + lo) // 2; | |
t = list[mid][0] | |
if t == timestamp: | |
return list[mid][1] | |
if t < timestamp: | |
ans = list[mid][1] | |
lo = mid + 1 | |
else: | |
hi = mid - 1 | |
return ans | |
# Your TimeMap object will be instantiated and called as such: | |
# obj = TimeMap() | |
# obj.set(key,value,timestamp) | |
# param_2 = obj.get(key,timestamp) |