重视 Treemap 理解问题

putting value in Treemap understanding issues

我 运行 解决了一个 leetcode 问题。并在讨论区找到解决方案

问题- https://leetcode.com/problems/stock-price-fluctuation/

解决方案-

class StockPrice {
    HashMap<Integer, Integer> hm; //timestamp,price
    TreeMap<Integer, Integer> tm; //price, frequency
    int current;
    
    public StockPrice() {
        
        hm = new HashMap<>();
        tm = new TreeMap<>();
        current = 0;

    }
    
    public void update(int timestamp, int price) {
        
        //check whether latest timestamp or current timestamp is larger...
        current = Math.max(current, timestamp); //if timesatamp already present
        if(hm.containsKey(timestamp))
        {
            
            int oldprice=hm.get(timestamp);

           if(tm.get(oldprice)==1){
               tm.remove(oldprice); // 
           }
            else{
                tm.put(oldprice, tm.get(oldprice)-1); 
                
            }
        }
        //update new price in hm
        hm.put(timestamp, price);
        //update new frequency of new price in treemap
        tm.put (price, tm.getOrDefault(price,0)+1);
        
    }
    
    public int current() {
    return hm.get(current);
    }
    
    public int maximum() {
        return tm.lastKey();
    }
    
    public int minimum() {
        return tm.firstKey();
        
    }
}
但我不明白以下部分。 如果有人能解释那就太好了

  1.                 tm.put(oldprice, tm.get(oldprice)-1); 
    
  2.         tm.put (price, tm.getOrDefault(price,0)+1);
    

要解决此问题,您需要知道股票以特定价格交易的频率。

一个例子:

  • 它在时间戳 1 交易 10,在时间戳 2 交易 5。现在最高价格是 10。(有一笔交易 10,一笔交易 5)
  • 时间戳 1 的价格更新为 3。现在最高价格为 5。(有一笔交易 3,一笔交易 5)

另一个例子:

  • 时间戳1成交10,时间戳2成交5,时间戳3成交10。最高价也是10。(10成交两笔,5成交一笔)
  • 时间戳 1 的价格更新为 3。现在最高价格仍然是 10(因为时间戳 3 的交易)。 (有一笔交易 10 笔,一笔交易 3 笔,一笔交易 5 笔)

    tm.put (price, tm.getOrDefault(price,0)+1);

注意到以特定价格发生了一笔交易。

更新旧交易时,

    if (tm.get(oldprice)==1) {
        tm.remove(oldprice); // 
    } else {
        tm.put(oldprice, tm.get(oldprice)-1); 
    }

要么删除旧价格的条目(如果该价格只有一笔交易),要么注意到该价格少了一笔交易。