需求分析:
●更新股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将正之前的错误价格。
----------对于这个需求,考虑用hash表。也就是unordered_map<时间戳,价格>
●找到当前记录里最新股票价格。最新股票价格定义为时间戳最晚的股票价格。
----------对于这个需求,可以定义一个变量来存最大的时间戳
●找到当前记录里股票的最高价格。
----------对于这个需求,有两种解法:
(1)用multiset存价格,并且删除价格的时候只能删除一个
(2)用map<价格,次数>,而不能用map<价格,时间戳>,因为价格可能会重复
●找到当前记录里股票的最低价格。
----------这个需求,解法同上。
解法一:用multiset
class StockPrice {
public:
//放到构造函数的外面!!!
int last_time = INT_MIN;
unordered_map<int, int> mp;
multiset<int> s; //存价格 不能去重,且只能删除一个元素!!!
StockPrice() {
}
void update(int timestamp, int price) {
last_time = max(last_time, timestamp);
if (mp.find(timestamp) == mp.end()) { //找不到 复杂度O(1)!!!
mp[timestamp] = price;
s.insert(price);
} else { //能找到
s.erase(s.lower_bound(mp[timestamp])); //或者s.erase(s.find(mp[timestamp]));!!!
//s.erase(mp[timestamp]); 错误!!!
mp[timestamp] = price;
s.insert(price);
}
}
int current() {
return mp[last_time];
}
int maximum() {
return *s.rbegin();
}
int minimum() {
return *s.begin();
}
};
易错点:
1:复杂的数据结构不能放在构造函数里面
2:●更新股票在某一时间戳的股票价格,如果有之前同一时间戳的价格,这一操作将正之前的错误价格。对于这个需求:先考虑hash而不是map,因为不排序复杂度更高。
3:set存价格的话,不能去重,因为价格可能相同,所以只能用multiset而不能用set!!!同时,删除的时候只能删除一个元素,而不能把相同的所有元素都删掉!!!
auto tmp= s.lower_bound(mp[timestamp]);
s.erase(tmp);
//而不是s.erase(mp[timestamp]);
解法二:用map<价格,次数>
class StockPrice {
public:
unordered_map<int, int> timePrice;
int lasttime = INT_MIN;
map<int, int> priceTimes; //价格 对 次数
StockPrice() {
}
void update(int timestamp, int price) {
lasttime = max(lasttime, timestamp);
if (timePrice.find(timestamp) == timePrice.end()) { //没出现
timePrice[timestamp] = price;
priceTimes[price]++;
}else { //出现过
int old = timePrice[timestamp];
priceTimes[old]--;
if (!priceTimes[old]) {
priceTimes.erase(old);
}
timePrice[timestamp] = price;
priceTimes[price]++;
}
}
int current() {
return timePrice[lasttime];
}
int maximum() {
return priceTimes.rbegin()->first;
}
int minimum() {
return priceTimes.begin()->first;
}
};