牛客BM43:包含min函数的栈
我们都知道栈结构的push、pop、top操作都是O(1),但是min函数做不到,于是想到在push的时候就将最小值记录下来,由于栈先进后出的特殊性;我们可以构造一个单调栈,保证栈内元素都是递增的,栈顶元素就是当前最小的元素。
import java.util.*;
import java.util.Stack;
public class Solution {
//用于栈的push和pop
Stack<Integer> s1 = new Stack<>();
//存储最小min
Stack<Integer> s2 = new Stack<>();
public void push(int node) {
s1.push(node);
//空或者新的元素比较小,则入栈
if (s2.isEmpty() || s2.peek() > node) {
s2.push(node);
} else {
//重复加入栈顶
s2.push(s2.peek());
}
}
public void pop() {
s1.pop();
s2.pop();
}
public int top() {
return s1.peek();
}
public int min() {
return s2.peek();
}
}
涉及单调栈,请见每日温度——单调栈解法。
单调栈本质就是时间换空间,在遍历的过程中需要一个栈记录右边第一个比当前元素高的数值,优点是只需要遍历一次即可。
利用单调栈需要明确: