题目链接
思路:哈希表+有序集合
分析:这个题目一共四个要求,一个时间对应一个价格,这个就很容易想到哈希表的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();
}
}
这个题目还有很多解法。
好好生活。
不打扰是我的温柔。