我特么服了,开始看题目还以为是在之前区间内找一个最大的连续天数。
没想到特么是需要连着当天的最长区间。
思路
因为是从今天开始往前走,找到一个大于它的价格即停止搜索,即往前找到第一个大于当前price
的数,容易想到使用单调栈解决。
因为我们需要找到前面区间内第一个大于等于当前price
的值,所以可以维护一个单调递减的栈。
求解找到第一个大于或小于当前值的相关问题,可以考虑使用单调栈来解决。
算法设计如下:
- 初始化栈
s
,以及当前价格所在位置下标curIdx
(第几天) - 调用
next
:新元素price
进入后,先将curIdx++
,再将栈顶小于等于price
的元素全部出栈,直到栈为空或栈顶元素大于price
。 - 计算区间长度:为计算区间长度,每次元素入栈都需要将下标同时入栈。
- 区间左边界
l
:若此时栈为空则l = 0
;否则令l
为栈顶元素下标 - 区间右边界
r
:即为当前下标curIdx
- 区间左边界
此时区间长度为(l, r]
中的元素个数,即为l-r
。
代码如下:
class StockSpanner {
public:
StockSpanner() {
curIdx = 0;
}
int next(int price) {
while(!s.empty()){
if (s.top().first <= price){
s.pop();
} else {
break;
}
}
int l = s.empty() ? 0 : s.top().second;
s.push({price, ++curIdx});
return curIdx - l;
}
private:
stack<pair<int, int>> s;
int curIdx;
};