标签 |
---|
单调栈 |
题目
https://leetcode-cn.com/problems/online-stock-span/
分析
我们用单调栈维护一个单调递减的价格序列,并且对于每个价格,存储一个 weight 表示它离上一个价格之间(即最近的一个大于它的价格之间)的天数。如果是栈底的价格,则存储它本身对应的天数。例如 [11, 3, 9, 5, 6, 4, 7] 对应的单调栈为 (11, weight=1), (9, weight=2), (7, weight=4)。
代码
class StockSpanner {
Deque<Integer> stack;
Deque<Integer> weight;
public StockSpanner() {
stack=new LinkedList<>();
weight=new LinkedList<>();
}
public int next(int price) {
int w=1;
while(!stack.isEmpty()&&stack.peekLast()<=price){
stack.removeLast();
w+=weight.removeLast();
}
stack.addLast(price);
weight.addLast(w);
return w;
}
}
/**
* Your StockSpanner object will be instantiated and called as such:
* StockSpanner obj = new StockSpanner();
* int param_1 = obj.next(price);
*/
复杂度
时间复杂度:O(Q),其中 Q 是调用 next() 函数的次数。
空间复杂度:O(Q)。