题目
题解
暴力法
直接暴力就可以过…
class StockSpanner {
List<Integer>list;
public StockSpanner() {
list=new ArrayList<>();
}
public int next(int price) {
int res=0;
list.add(price);
int i=list.size()-1;
while(i>=0&&list.get(i--)<=price){
res++;
}
return res;
}
}
时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n ) O(n) O(n)
单调栈
对于这种“小于或等于今天价格”的问题为什么用单调栈大概应该有些感觉了
用单调栈存储 价格下标以及股票价格,调用next函数时,先将栈中价格小于等于此时 price 的元素都弹出,直到遇到一个大于 price 的值,并将 price 入栈,计算下标差返回。
class StockSpanner {
Deque<int[]>stack;
int idx;
public StockSpanner() {
stack=new ArrayDeque<>();
//保证栈不为空
stack.push(new int[]{-1,Integer.MAX_VALUE});
idx=-1;
}
public int next(int price) {
idx++;
//比当前price小就弹出
while(stack.peek()[1]<=price){
stack.pop();
}
//计算下标差
int res=idx-stack.peek()[0];
stack.push(new int[]{idx,price});
return res;
}
}
/**
* Your StockSpanner object will be instantiated and called as such:
* StockSpanner obj = new StockSpanner();
* int param_1 = obj.next(price);
*/
时间复杂度: O ( n ) O(n) O(n),优于暴力法
空间复杂度: O ( n ) O(n) O(n)