前言
leetcode上,剑指offer,包含min函数的栈:
题目地址
解题思路
对于栈来说,pop、push、peek的时间复杂度都是O(1),但是如果要找最小值的话,时间复杂度就是O(n),因为需要遍历栈中的元素,那么如何降低时间复杂度呢?就用空间换时间,构造一个辅助栈,维护这个栈,使得栈顶的元素始终为原始栈中的最小元素便可。
class MinStack {
Stack<Integer> stack1,stack2;
/** initialize your data structure here. */
public MinStack() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void push(int x) {
stack1.add(x);
if(stack2.empty()||x<=stack2.peek()){
stack2.add(x);
}
}
public void pop() {
if(stack1.pop().equals(stack2.peek())){
stack2.pop();
}
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.min();
*/
关于栈的基础定义、方法一定要熟悉,其实思路不难,但是有一些小细节要注意,不然很容易编译无法通过。