思路如下: 题中要求min、push、和pop的时间复杂度都要为O(1),就不能使用遍历找出最小值了。所以需要想办法在加入元素的时候记录min。因为不知道存入多少个,还需要搞一个数组扩容命令。
我最初的代码是计划使用一个数组动态规划的形式记录每一位的min值,新加入的时候与min【temp-1】比较,如果比它小 min【temp】=arr【temp】,否则min【temp】=arr【temp-1】.
后来发现题解中有一个更加聪明的记录方法。使用主栈A<Integer>,创建另一个栈B,新加入一个元素,可以将其与栈B中上一个元素进行比较,如果大于上一个元素,就不用加入B了,因为肯定不是当前元素中最小的。
如果小于等于(注意!等于也要加入,否则pop时就出错了)上一个元素(这个是加入前栈A中最小的元素),说明当前栈A中最小的元素就是这个新元素。就加入B。pop弹出的时候,比较弹出的元素是不是与栈B顶部元素equals相等。如果相等就pop B顶部元素。否则就不弹出。
class MinStack {
/** initialize your data structure here. */
int[] arr = new int[5];
int temp=-1;
int mins[]= new int[5];
public void addMaxLength(){
arr=Arrays.copyOf(arr,arr.length*2);
mins=Arrays.copyOf(mins,mins.length*2);
}
public MinStack() {
}
public void push(int x) {
if(temp==arr.length-1){
addMaxLength();
}
arr[++temp]=x;
if(temp==0){
mins[0]=arr[temp];
}else{
if(arr[temp]<mins[temp-1]){
mins[temp]=arr[temp];
}else{
mins[temp]=mins[temp-1];
}
}
}
public void pop() {
if(temp<0){
//空栈
return;
}
temp--;
}
public int top() {
if(temp<0){
throw new RuntimeException ("空栈");
}
return arr[temp];
}
public int min() {
return mins[temp];
}
}
/**
* 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();
*/