题目
类型:设计
解题思路
使用「哈希表」来记录 {时间:价格} 的映射关系
关于 current 操作,我们可以维护一个最大的时间戳 cur,在调用 current 的时候直接 O(1) 查得结果。
然后考虑解决 update
操作中对相同时间点的更新问题,可以使用 TreeMap
(红黑树)来解决该问题。
以 {价格:该价格对应的时间点数量} 的 KV 形式进行存储,key
按照「升序」进行排序。
然后对传入的 timestamp
是否已经被记录(是否已经存在哈希表中)进行分情况讨论:
传入的 timestamp
未被记录,直接更新哈希表和 TreeMap
;
传入的 timestamp
已被记录,此时需要先从哈希表取出旧价格 old
,然后用旧价格对 TreeMap
进行修改(如果该价格只有一个时间点,将该价格直接从 TreeMap
中移除;若有多个时间点,则对该价格对应的时间点数量进行减一操作),然后再使用传入的新价格 price
更新哈希表和 TreeMap
。minimum
和 maximum
操作则只需要取得 TreeMap
的首尾 Key
即可。
代码
class StockPrice {
int cur;
Map<Integer, Integer> map = new HashMap<>();
TreeMap<Integer, Integer> ts = new TreeMap<>();
public void update(int timestamp, int price) {
cur = Math.max(cur, timestamp);
if (map.containsKey(timestamp)) {
int old = map.get(timestamp);
int cnt = ts.get(old);
if (cnt == 1) ts.remove(old);
else ts.put(old, cnt - 1);
}
map.put(timestamp, price);
ts.put(price, ts.getOrDefault(price, 0) + 1);
}
public int current() {
return map.get(cur);
}
public int maximum() {
return ts.lastKey();
}
public int minimum() {
return ts.firstKey();
}
}