题目
2034.股票价格波动
题目大意
给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格 。
不巧的是,由于股票市场内在的波动性,股票价格记录可能不是按时间顺序到来的。某些情况下,有的记录可能是错的。如果两个有相同时间戳的记录出现在数据流中,前一条记录视为错误记录,后出现的记录 更正 前一条错误的记录。
请你设计一个算法,实现:
- 更新 股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将 更正 之前的错误价格。
- 找到当前记录里 最新股票价格 。最新股票价格 定义为时间戳最晚的股票价格。
- 找到当前记录里股票的 最高价格 。
- 找到当前记录里股票的 最低价格 。
请你实现 StockPrice
类:
StockPrice()
初始化对象,当前无股票价格记录。void update(int timestamp, int price)
在时间点timestamp
更新股票价格为price
。int current()
返回股票 最新价格 。int maximum()
返回股票 最高价格 。int minimum()
返回股票 最低价格 。
样例
数据规模
思路
在 c + + c++ c++中有两个关联容器,第一种是 m a p map map,内部是按照 k e y key key排序的,第二种是 u n o r d e r e d _ m a p unordered\_map unordered_map,容器内部是无序的,使用 h a s h hash hash组织内容的。
考虑使用 m a p < i n t , i n t > map<int,int> map<int,int>和 m u l t i s e t < i n t > multiset<int> multiset<int>。对于 m a p < i n t , i n t > map<int,int> map<int,int>来讲,它默认以 k e y key key为关键字进行排序;对于 m u l t i s t e < i n t > multiste<int> multiste<int>来讲,它默认按储存的值进行从小到大的排序。
定义map<int,int>t
来存储时间戳对应的股票价格 。如果要返回最新的股票价格,可以直接返回t.rbegin()->second
。
定义multiset<int>p
来存储所有的股票价格,它默认从小到大排序,所以最高价格为*p.begin()
,最低价格为*p.rbegin()
。注意在修改价格的时候,需要删除原来的价格,然后添加新的价格。
代码
class StockPrice {
public:
map<int,int>t;
multiset<int>p;
StockPrice() {
t.clear();
p.clear();
}
void update(int timestamp, int price) {
if(t.count(timestamp)){
p.erase(p.find(t[timestamp]));
}
p.insert(price);
t[timestamp]=price;
}
int current() {
return t.rbegin()->second;
}
int maximum() {
return *p.rbegin();
}
int minimum() {
return *p.begin();
}
};