主要思路
单调栈
求出小于或等于今天价格的最大连续日数等价于求出最近的一个大于今日价格的日子。
我们用单调栈维护一个单调递减的价格序列,并且对于每个价格,存储一个 weight 表示它离上一个价格之间(即最近的一个大于它的价格之间)的天数。
当栈为空或者栈顶价格大于当前价格时直接入栈,否则循环弹出栈顶元素,直到栈中价格大于当前价格,同时累加弹出价格对应的连续天数,结果就是当前价格的连续天数,最后入栈,详见代码。
class StockSpanner {
private:
stack<pair<int,int>> mono_stk;//单调栈,价格递减 <price,weight>
public:
StockSpanner(){}
int next(int price) {
int day = 1;
while(!mono_stk.empty()&&mono_stk.top().first<=price) {
day += mono_stk.top().second;
mono_stk.pop();
}
mono_stk.push(make_pair(price,day));
return day;
}
};