问题描述:
- 编写一个
StockSpanner
类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。- 今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。
- 例如,如果未来七天股票的价格是
[100, 80, 60, 70, 60, 75, 85]
,那么股票跨度将是[1, 1, 1, 2, 1, 4, 6]
。
核心思路:
- 维护一个单调递增的单调栈即可,栈中要同时维护数值和索引。
代码实现:
class StockSpanner
{
private:
stack<pair<int, int>> stk;
int i = 0;
public:
StockSpanner() {}
int next(int price)
{
++i;
while(!stk.empty() and price >= stk.top().second)
stk.pop();
int ans = stk.empty() ? i : i - stk.top().first;
stk.push({i, price});
return ans;
}
};