题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
参考思路
由于时间复杂度需要为O(1),因此我们需要在每次入栈时候就判断最小值,并一直保留下来,这可以用一个临时变量来实现。但是如果就一个简单的临时变量会在最小值出栈时出现问题,因为最小值出栈了就无法再找到前面的所有最小值。因此可以采用双栈来实现,用一个整型栈保留堆栈元素,另一个整型栈保存所有的最小值,并更新。
参考代码
import java.util.Stack;
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
ArrayList<Integer> arrayListOther = new ArrayList<Integer>();
int minNode = Integer.MAX_VALUE;
public void push(int node) {
if(minNode > node) {
minNode = node;
arrayListOther.add(node);
}
arrayList.add(node);
}
public void pop() {
int topNode = arrayList.get(arrayList.size()-1);
if(topNode == minNode) {
arrayListOther.remove(arrayListOther.size()-1);
minNode = arrayListOther.get(arrayListOther.size()-1);
}
arrayList.remove(arrayList.size()-1);
}
public int top() {
return arrayList.get(arrayList.size()-1);
}
public int min() {
return minNode;
}
}
奇妙的思路-----压缩还原法
每次入栈时,如果入栈元素比当前最小值小,则更新最小值。同时用入栈元素去减当前的最小值,然后只将差值入栈。
出栈时,如果栈顶元素为负数,说明这个就是当前的最小值,更新最小值,然后出栈;如果栈顶元素为正数,则直接出栈。
参考代码如下:
import java.util.Stack;
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
int minNode = Integer.MAX_VALUE;
public void push(int node) {
arrayList.add(node-minNode);
if(node < minNode) {
minNode = node;
}
}
public void pop() {
int topNode = arrayList.get(arrayList.size()-1);
if(topNode < 0) {
minNode = minNode - topNode;
}
arrayList.remove(arrayList.size()-1);
}
public int top() {
return (arrayList.get(arrayList.size()-1) + minNode);
}
public int min() {
return minNode;
}
}