一、题目
二、代码
单调栈通常表现元素基本有序的情况下有一些另类元素:单调栈一般存储下标,下面的get不符合封装性。
/**
单调栈适用于求解最大/最小子序列问题或下一个更大/更小问题
*/
class StockSpanner {
// 存储日期单调递减 单调栈
private Stack<Integer> dateStack;
// 存储所有股票价格
private List<Integer> numList;
public StockSpanner() {
dateStack = new Stack<>();
numList = new ArrayList<>();
}
public int next(int price) {
numList.add(price);
if (dateStack.empty()){
dateStack.push(numList.size() - 1);
return 1;
}
while (!dateStack.empty() && numList.get(dateStack.peek()) <= price) {
dateStack.pop();
}
dateStack.push(numList.size() - 1);
int result = 0;
if (dateStack.size() >= 2){
result= dateStack.peek() - dateStack.get(dateStack.size() - 2);
}else {
result = dateStack.peek() + 1;
}
return result;
}
}
/**
* Your StockSpanner object will be instantiated and called as such:
* StockSpanner obj = new StockSpanner();
* int param_1 = obj.next(price);
*/
答案改动,增加封装性。
/**
单调栈适用于求解最大/最小子序列问题或下一个更大/更小问题。题目的模板固定 */
class StockSpanner {
// 存储日期单调递减
private Stack<Integer> dateStack;
// 存储所有股票价格
private List<Integer> numList;
public StockSpanner() {
dateStack = new Stack<>();
numList = new ArrayList<>();
}
public int next(int price) {
numList.add(price);
while (!dateStack.empty() && numList.get(dateStack.peek()) <= price) {
dateStack.pop();
}
int result = 0;
if (dateStack.isEmpty()) {
result = numList.size();
} else {
result = numList.size() - dateStack.peek() - 1;
}
dateStack.push(numList.size() - 1);
return result;
}
}
/**
* Your StockSpanner object will be instantiated and called as such:
* StockSpanner obj = new StockSpanner();
* int param_1 = obj.next(price);
*/