2034. 股票价格波动
方法: 哈希表 + 有序集合
from sortedcontainers import SortedList
class StockPrice:
def __init__(self):
self.price = SortedList()
self.timePriceMap = {}
self.maxTimestamp = 0
def update(self, timestamp: int, price: int) -> None:
if timestamp in self.timePriceMap:
self.price.discard(self.timePriceMap[timestamp])
self.price.add(price)
self.timePriceMap[timestamp] = price
if timestamp > self.maxTimestamp:
self.maxTimestamp = timestamp
def current(self) -> int:
return self.timePriceMap[self.maxTimestamp]
def maximum(self) -> int:
return self.price[-1]
def minimum(self) -> int:
return self.price[0]

class StockPrice {
public:
StockPrice() {
this->maxTimestamp = 0;
}
void update(int timestamp, int price) {
if (timestamp > maxTimestamp){
maxTimestamp = timestamp;
}
int prevPrice = timePriceMap.count(timestamp) ? timePriceMap[timestamp] : 0;
timePriceMap[timestamp] = price;
if (prevPrice > 0){
auto it = prices.find(prevPrice);
if (it != prices.end()){
prices.erase(it);
}
}
prices.emplace(price);
}
int current() {
return timePriceMap[maxTimestamp];
}
int maximum() {
return *prices.rbegin();
}
int minimum() {
return *prices.begin();
}
private:
int maxTimestamp;
unordered_map<int, int> timePriceMap;
multiset<int> prices;
};
方法:哈希表 + 两个优先队列
class StockPrice:
def __init__(self):
self.maxPrice = []
self.minPrice = []
self.timePriceMap = {}
self.maxTimestamp = 0
def update(self, timestamp: int, price: int) -> None:
heappush(self.maxPrice, (-price, timestamp))
heappush(self.minPrice, (price, timestamp))
self.timePriceMap[timestamp] = price
if timestamp > self.maxTimestamp:
self.maxTimestamp = timestamp
def current(self) -> int:
return self.timePriceMap[self.maxTimestamp]
def maximum(self) -> int:
while True:
price, timestamp = self.maxPrice[0]
if -price == self.timePriceMap[timestamp]:
return -price
heappop(self.maxPrice)
def minimum(self) -> int:
while True:
price, timestamp = self.minPrice[0]
if price == self.timePriceMap[timestamp]:
return price
heappop(self.minPrice)

typedef pair<int, int> pii;
class StockPrice {
public:
StockPrice() {
this->maxTimestamp = 0;
}
void update(int timestamp, int price) {
if (timestamp > maxTimestamp){
maxTimestamp = timestamp;
}
timePriceMap[timestamp] = price;
pqMax.emplace(price, timestamp);
pqMin.emplace(price, timestamp);
}
int current() {
return timePriceMap[maxTimestamp];
}
int maximum() {
while (true){
int price = pqMax.top().first, timestamp = pqMax.top().second;
if (price == timePriceMap[timestamp]){
return price;
}
pqMax.pop();
}
}
int minimum() {
while (true){
int price = pqMin.top().first, timestamp = pqMin.top().second;
if (price == timePriceMap[timestamp]){
return price;
}
pqMin.pop();
}
}
private:
int maxTimestamp;
unordered_map<int, int> timePriceMap;
priority_queue<pii, vector<pii>, less<pii>> pqMax;
priority_queue<pii, vector<pii>, greater<pii>> pqMin;
};