1.具有getMin功能的最小栈
要求pop,push,getMin操作的时间复杂度都是O(1)
思路
“以空间换时间”,使用辅助栈是常见的做法。
使用两个栈,stackData用于保存存到栈里的数据,stackMin用于保存当前stackData中的最小值
方法1:
- push方法:stackData直接push,stackMin为空时,也直接push到stackMin;stackMin不为空时,比较要压入的元素和stackMin栈顶元素,如果要压入的小于或等于stackMin的栈顶,便压入stackMin,否则不压入stackMin
- pop方法:stackData直接pop,如果要pop的元素等于stackMin的栈顶,那么stackMin也pop,否则stackMin不pop
- getMin方法:stackMin的栈顶元素即为所求
方法2:
- push方法:stackData直接push,stackMin为空时,也直接push到stackMin;stackMin不为空时,比较要压入的元素和stackMin栈顶元素,如果要压入的小于或等于stackMin的栈顶,便压入stackMin;否则,将stackMin的栈顶元素再压入stackMin一次
- pop方法:两个栈都pop,return stackData pop出来的值
- getMin方法:stackMin的栈顶元素
方法1和方法2的共同点在于所有操作的时间复杂度都是O(1),空间复杂度都是O(n).区别是:方法1压入时节省空间,弹出时费时间;方法2压入时费空间,弹出时省时间.
代码
方法1:
class MyStack{
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MyStack(){
this.stackData = new Stack<Integer>();
this.stackMin = new Stack<Integer>();
}
public void push(int newNum){
if(this.stackMin.isEmpty()){
this.stackMin.push(newNum);
}else if(newNum<=this.getMin()){
this.stackMin.push(newNum);
}
this.stackData.push(newNum);
}
public int pop(){
if(this.stackData.isEmpty()){
throw new RuntimeException("your stack is empty");
}else{
int value = this.stackData.pop();
if(value==this.getMin()){
this.stackMin.pop();
}
return value;
}
}
public int getMin(){
if(this.stackMin.isEmpty()){
throw new RuntimeException("your stack is empty");
}else{
return this.stackMin.peek();
}
}
}
public class Main {
public static void main(String[] args) {
MyStack stack = new MyStack();
stack.push(3);
stack.push(4);
stack.push(5);
stack.push(1);
stack.push(2);
stack.push(1);
int a = stack.getMin();
System.out.println("ans="+a);
}
}
方法2:
class MyStack{
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public MyStack(){
this.stackData = new Stack<Integer>();
this.stackMin = new Stack<Integer>();
}
public void push(int newNum){
if(this.stackMin.isEmpty()){
this.stackMin.push(newNum);
}else if(newNum<=this.getMin()){
this.stackMin.push(newNum);
}else{
int newMin = this.stackMin.peek();
this.stackMin.push(newMin);
}
this.stackData.push(newNum);
}
public int pop(){
if(this.stackData.isEmpty()){
throw new RuntimeException("your stack is empty");
}else{
this.stackMin.pop();
return this.stackData.pop();
}
}
public int getMin(){
if(this.stackMin.isEmpty()){
throw new RuntimeException("your stack is empty");
}else{
return this.stackMin.peek();
}
}
}
public class Main {
public static void main(String[] args) {
MyStack stack = new MyStack();
stack.push(3);
stack.push(4);
stack.push(5);
stack.push(1);
stack.push(2);
stack.push(1);
int a = stack.getMin();
System.out.println("ans="+a);
}
}
出处:程序员代码面试指南