难度:中等
目录
一、问题描述
二、解题思想
三、解题
1、判断极端情况
2、代码实现
四、总结
这里直接采用的是LeetCode上面的问题描述。
给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格 。
不巧的是,由于股票市场内在的波动性,股票价格记录可能不是按时间顺序到来的。某些情况下,有的记录可能是错的。如果两个有相同时间戳的记录出现在数据流中,前一条记录视为错误记录,后出现的记录 更正 前一条错误的记录。
请你设计一个算法,实现:
请你实现 StockPrice
类:
下面给出示例:
提示:
这里刚开始想使用 vector
"1","2","4" 没有出现时间戳 "3" 对于离散的序列, 我们需要使用 哈希表 来维护其 时间戳 与对于的价格。
为了能实时访问到 最大 与 最小的价格, 我们需要实时维护到 一个价格表 。有两种解决办法:
还有一种情况,就是 更新了价格,但是 之前的价格 也存储到了 价格表 中,我们需要将之前的价格在价格表中进行 删除。
对于需要返回最新的价格,这里是需要使用一个 CurrentTimestamp 来存储最大的时间戳,方便直接在哈希表中查找 最新的价格。
此题无极端情况。
class StockPrice {
public:
StockPrice() {
this->CurrentTimestamp = 0;
}
void update(int timestamp, int price) {
//保存最新时间戳,方便访问最新价格
CurrentTimestamp = max(timestamp,CurrentTimestamp);
//保存前当前时间戳的前一个价格 如果没有的话 就是 0
// timestampPrice.count(timestamp) 统计timestamp之前出现过几次 没有的话 前一个价格为 0
int prePrice = timestampPrice.count(timestamp) ? timestampPrice[timestamp] : 0;
// 保存时间戳的 最新价格
timestampPrice[timestamp] = price;
//维护价格表,如果当前timestamp 的前一个价格 大于 0 那么在有序价格表中删除该价格,防止错误访问
if(prePrice > 0){
auto item = Prices.find(prePrice);
if(item != Prices.end()){
Prices.erase(item);
}
}
//将最新价格保存到 有序价格表中
Prices.emplace(price);
}
int current() {
//最新价格由最新时间戳访问
return timestampPrice[CurrentTimestamp];
}
int maximum() {
//Prices.rbegin()为最后一个元素的指针(迭代器),需要解引用
return *Prices.rbegin();
}
int minimum() {
//Prices.begin()为首元素的指针(迭代器),需要解引用
return *Prices.begin();
}
private:
//时间戳与对应价格匹配
unordered_map timestampPrice;
//使用有序表 维护价格
multiset Prices;
//保存最新时间戳
int CurrentTimestamp;
};
对于离散的数据,首先考虑就是使用 哈希表 来存储相应的键值对,对于需要实时返回 最大 最小 的信息的数据,我们直接使用 有序表 multiset
如果对你有帮助的话,请star ♥ 一下,收藏一下,蟹蟹啦!