设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。
代码实现 StockSpanner 类:
StockSpanner() 初始化类对象。
int next(int price) 给出今天的股价 price ,返回该股票当日价格的 跨度 。
示例:
调用 next 时,
如果把每日的 price 当成数组不同下标的值,即需要求出每个值与上一个更大元素之间的下标之差。这种题目可以用单调栈求解,具体原理如下:
此题的具体解法:
栈的元素可以是股票价格的下标(即天数)和股票价格的二元数对,并且在栈中先插入一个天数为 0 天,最大值作为价格的二元数对,来保证栈不会为空。调用 next 时,先将栈中价格小于等于此时 price 的元素都弹出,直到遇到一个大于 price 的值,并将 price 入栈,计算下标差返回。
class StockSpanner {
private:
stack<pair<int, int>> stackp;
int ts;
public:
StockSpanner() {
this->stackp.emplace(0, INT_MAX);
this->ts = 0;
}
int next(int price) {
ts++;
while (price >= stackp.top().second) {
stackp.pop(); // 出栈
}
int res = ts - stackp.top().first;
stackp.emplace(ts, price); // 入栈
return res;
}
};
【1】https://leetcode.cn/problems/online-stock-span/