一、题目
二、思路
左边方向,<= 本值的,连续最大间隔。
即为左边方向,第一个 >= 本值,的最大下标之差。
既然是第一个 >= 本值的问题,即可用单调栈解决。
因此构造单调递减栈(从栈底向栈顶方向递减)。栈里记录了 pair<下标,值>
。当新元素 >= 栈顶时出栈,当新元素入栈时记录和栈顶的下标之差。
注意下图的测试用例:第三个元素期望输出为3,因此 while 内用 >= 而不是 > 来判断:
三、题解
class StockSpanner {
public:
StockSpanner() {
st.emplace(-1,INT_MAX);
idx = -1;
}
int next(int price) {
++idx;
while (!st.empty() && price >= st.top().second) {
st.pop();
}
int ret = idx - st.top().first;
st.emplace(idx, price);
return ret;
}
private:
stack<pair<int,int>> st;
int idx;
};
/**
* Your StockSpanner object will be instantiated and called as such:
* StockSpanner* obj = new StockSpanner();
* int param_1 = obj->next(price);
*/