leetcode 股票价格波动

题目链接
思路:哈希表+有序集合
分析:这个题目一共四个要求,一个时间对应一个价格,这个就很容易想到哈希表的k-v,这里需要得到最新价格,那么我们定义一个变量记录最新的时间即可。
还需要得到最高的价格和最低的价格,又要和哈希表有关,那么自然想到了有序的哈希表,TreeMap,不同的是,第一个哈希表的key是时间,value是价格,而TreeMap的key是价格,value是次数。

这里主要就是更新的思路多一些。
更新的时候,如果这个时间是第一次出现,那么,直接放进哈希表中,并且在有序哈希表中将该价格出现的次数+1。
如果这个时间不是第一次出现,那么取出老的价格,在有序哈希表中这个价格出现的次数-1,如果原来就只出现过一次,那么就直接移除即可。
代码:

class StockPrice {
        int cur ;
        //记录时间和价格的映射关系
        HashMap<Integer, Integer> timePriceMap;
        //记录价格出现的次数
        TreeMap<Integer, Integer> priceTimesMap;
        public StockPrice() {
            cur = -1;
            timePriceMap = new HashMap<>();
            priceTimesMap = new TreeMap<>();
        }

        public void update(int timestamp, int price) {
            cur = cur < timestamp ? timestamp : cur;

            if(timePriceMap.containsKey(timestamp)){
                Integer old = timePriceMap.get(timestamp);
                Integer cnt = priceTimesMap.get(old);
                if(cnt ==1){
                    //移除老价格
                    priceTimesMap.remove(old);
                }else {
                    //将老价格出现的次数-1
                    priceTimesMap.put(old, cnt -1);
                }
            }

            //放进去,不管有没有出现过
            timePriceMap.put(timestamp, price);

            //更新这个价格出现的次数
            priceTimesMap.put(price,priceTimesMap.getOrDefault(price,0)+1);
        }

        public int current() {
            return timePriceMap.get(cur);
        }

        public int maximum() {
            return priceTimesMap.lastKey();
        }

        public int minimum() {
            return priceTimesMap.firstKey();
        }
    }

这个题目还有很多解法。

好好生活。
不打扰是我的温柔。

你可能感兴趣的:(算法,leetcode,动态规划,算法)