题目

类型:设计

image.png

解题思路

使用「哈希表」来记录 {时间:价格} 的映射关系
关于 current 操作,我们可以维护一个最大的时间戳 cur,在调用 current 的时候直接 O(1) 查得结果。
然后考虑解决 update 操作中对相同时间点的更新问题,可以使用 TreeMap(红黑树)来解决该问题。
以 {价格:该价格对应的时间点数量} 的 KV 形式进行存储,key 按照「升序」进行排序。
然后对传入的 timestamp 是否已经被记录(是否已经存在哈希表中)进行分情况讨论:

传入的 timestamp 未被记录,直接更新哈希表和 TreeMap
传入的 timestamp 已被记录,此时需要先从哈希表取出旧价格 old,然后用旧价格对 TreeMap 进行修改(如果该价格只有一个时间点,将该价格直接从 TreeMap 中移除;若有多个时间点,则对该价格对应的时间点数量进行减一操作),然后再使用传入的新价格 price 更新哈希表和 TreeMap
minimummaximum 操作则只需要取得 TreeMap 的首尾 Key 即可。

代码

  1. class StockPrice {
  2. int cur;
  3. Map<Integer, Integer> map = new HashMap<>();
  4. TreeMap<Integer, Integer> ts = new TreeMap<>();
  5. public void update(int timestamp, int price) {
  6. cur = Math.max(cur, timestamp);
  7. if (map.containsKey(timestamp)) {
  8. int old = map.get(timestamp);
  9. int cnt = ts.get(old);
  10. if (cnt == 1) ts.remove(old);
  11. else ts.put(old, cnt - 1);
  12. }
  13. map.put(timestamp, price);
  14. ts.put(price, ts.getOrDefault(price, 0) + 1);
  15. }
  16. public int current() {
  17. return map.get(cur);
  18. }
  19. public int maximum() {
  20. return ts.lastKey();
  21. }
  22. public int minimum() {
  23. return ts.firstKey();
  24. }
  25. }