解题思路
首先时间戳到价格的映射,自然想到哈希表存;
最开始想到用两个单调队列,可以删除被更新的价格,但这样会在更新单调队列的时候删掉一些元素导致答案错误;
所有需要用优先队列,缺点是不能及时删除被更新的价格,但我们有实时的正确映射的哈希表可以参照,由此可以判断队首元素是否是正确价格,直到遇到正确价格才返回。
至于最新价格,用一个pair存最大时间戳和对应价格。
代码
typedef pair<int, int> pii;
class StockPrice {
public:
unordered_map<int, int> hash;
pair<int, int> newest = {0, 0};
priority_queue<pii, vector<pii>, less<pii>> qMax;
priority_queue<pii, vector<pii>, greater<pii>> qMin;
StockPrice() {
}
void update(int timestamp, int price) {
hash[timestamp] = price;
if(timestamp >= newest.first) newest = {timestamp, price};
qMax.push({price, timestamp});
qMin.push({price, timestamp});
}
int current() {
return newest.second;
}
int maximum() {
while(1) {
auto [p, t] = qMax.top();
if(hash[t] != p) qMax.pop();
else return p;
}
}
int minimum() {
while(1) {
auto [p, t] = qMin.top();
if(hash[t] != p) qMin.pop();
else return p;
}
}
};
/**
* Your StockPrice object will be instantiated and called as such:
* StockPrice* obj = new StockPrice();
* obj->update(timestamp,price);
* int param_2 = obj->current();
* int param_3 = obj->maximum();
* int param_4 = obj->minimum();
*/