题目:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
思路:首先可能到这道题你首先想到的是,循环求最小的输出就好了,但是,千万别忘记审题。
题目要求的是O(1),所以这个想法就不对了
那么有什么办法才能让它时间复杂度为O(1)呢?
我们使用一个辅助栈
思路是这样的
设存储值的栈为stack1
辅助栈为stack2
当来一个数压入栈中同时将这个数和辅助栈stack2的栈顶元素相比,如果小于stack2的栈顶元素,则压入该数,如果大于等 于,那么将stack2的栈顶元素压入stack2中。代表着当stack1中有这些元素的时候,它的最小元素是辅助栈的栈顶元素。
下面我们举个栗子,做如下操作
操作: stack1中 stack2中(辅助栈)
push3 3 3
push4 3,4 3,3
push2 3,4,2 3,3,2
push1 3,4,2,1 3,3,2,1
pop 4,2,1 3,3,2
pop 2,1 3,3
push0 2,1,0 3,3,0
Stack stack = new Stack();
List<Integer> list = new ArrayList<Integer>();
public void push(int node) {
list.add(node);
if(stack.isEmpty())
{
stack.push(node);
}else
{
if((int)stack.peek()>=node)
{
stack.add(node);
}else
{
stack.add(stack.peek());
}
}
}
public void pop() {
if(list.size()>=1)
{
Integer i = list.get(list.size()-1);
list.remove(list.size()-1);
}
stack.pop();
}
public int top() {
if(list.size()>=1)
{
Integer i = list.get(list.size()-1);
return i;
}
return -1;
}
public int min() {
return (int)stack.peek();
}