一、题目
1、题目描述
给你一支股票价格的数据流。数据流中每一条记录包含一个 时间戳 和该时间点股票对应的 价格 。
不巧的是,由于股票市场内在的波动性,股票价格记录可能不是按时间顺序到来的。某些情况下,有的记录可能是错的。如果两个有相同时间戳的记录出现在数据流中,前一条记录视为错误记录,后出现的记录 更正 前一条错误的记录。
请你设计一个算法,实现:
更新 股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将 更正 之前的错误价格。
找到当前记录里 最新股票价格 。最新股票价格 定义为时间戳最晚的股票价格。
找到当前记录里股票的 最高价格 。
找到当前记录里股票的 最低价格 。
请你实现 StockPrice 类:
StockPrice() 初始化对象,当前无股票价格记录。
void update(int timestamp, int price) 在时间点 timestamp 更新股票价格为 price 。
int current() 返回股票 最新价格 。
int maximum() 返回股票 最高价格 。
int minimum() 返回股票 最低价格 。
样例输入:["StockPrice", "update", "update", "current", "maximum", "update", "maximum", "update", "minimum"] [[], [1, 10], [2, 5], [], [], [1, 3], [], [4, 2], []]
样例输出:[null, null, null, 5, 10, null, 5, null, 2]
2、基础框架
- C++ 版本给出的基础框架代码如下:
class StockPrice {
public:
StockPrice() {
}
void update(int timestamp, int price) {
}
int current() {
}
int maximum() {
}
int minimum() {
}
};
3、原题链接
二、解题报告
1、思路分析
(
1
)
(1)
(1) 股票只有一只,求的是它在不同时间点的价格。
(
2
)
(2)
(2) 维护一个映射:时间
−
>
->
−> 价格。也就是对应哪个时间点的价格是多少time2priceHash
,于是要想如何更新这个映射关系。
(
2.1
)
(2.1)
(2.1) 如果对应时间的价格找不到,说明这是第一条记录,直接塞入哈希表。
(
2.2
)
(2.2)
(2.2) 如果能够找到,那么需要将之前的价格去另一个容器删掉,然后继续更新哈希表。
(
2.3
)
(2.3)
(2.3) 另一个容器需要满足更够求最小值、最大值。所以可以用 set
(因为set
是有序集合)。
(
3
)
(3)
(3) 查询最值操作可以在set
完成,由于相同价格会出现在不同的时间戳上,所以必须用multiset
。
2、时间复杂度
每次操作都是 O ( l o g n ) O(logn) O(logn) 。
3、代码详解
class StockPrice {
#define NOT_FIND -1
unordered_map< int, int > time2priceHash;
multiset<int> prices;
int curTime;
public:
StockPrice() {
curTime = NOT_FIND;
time2priceHash.clear();
prices.clear();
}
void update(int timestamp, int price) {
curTime = max(curTime, timestamp);
int prev = ( time2priceHash.find(timestamp) == time2priceHash.end() ? NOT_FIND : time2priceHash[timestamp] );
time2priceHash[timestamp] = price;
if(prev != NOT_FIND) {
auto it = prices.find(prev);
if(it != prices.end())
prices.erase(it);
}
prices.insert(price);
}
int current() {
return time2priceHash[curTime];
}
int maximum() {
return *prices.rbegin();
}
int minimum() {
return *prices.begin();
}
};
三、本题小知识
我们学会了
set
和multiset
的区别。
四、加群须知
相信看我文章的大多数都是「 大学生 」,能上大学的都是「 精英 」,那么我们自然要「 精益求精 」,如果你还是「 大一 」,那么太好了,你拥有大把时间,当然你可以选择「 刷剧 」,然而,「 学好算法 」,三年后的你自然「 不能同日而语 」。
那么这里,我整理了「 几十个基础算法 」 的分类,点击开启:
如果链接被屏蔽,或者有权限问题,可以私聊作者解决。
大致题集一览:
为了让这件事情变得有趣,以及「 照顾初学者 」,目前题目只开放最简单的算法 「 枚举系列 」 (包括:线性枚举、双指针、前缀和、二分枚举、三分枚举),当有 一半成员刷完 「 枚举系列 」 的所有题以后,会开放下个章节,等这套题全部刷完,你还在群里,那么你就会成为「 夜深人静写算法 」专家团 的一员。
不要小看这个专家团,三年之后,你将会是别人 望尘莫及 的存在。如果要加入,可以联系我,考虑到大家都是学生, 没有「 主要经济来源 」,在你成为神的路上,「 不会索取任何 」。
🔥联系作者,或者扫作者主页二维码加群,加入刷题行列吧🔥
🔥让天下没有难学的算法🔥
C语言免费动漫教程,和我一起打卡! 🌞《光天化日学C语言》🌞
让你养成九天持续刷题的习惯 🔥《九日集训》🔥
入门级C语言真题汇总 🧡《C语言入门100例》🧡
组团学习,抱团生长 🌌《算法零基础100讲》🌌
几张动图学会一种数据结构 🌳《画解数据结构》🌳
竞赛选手金典图文教程 💜《夜深人静写算法》💜