题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都为O(1)
思路:
首先想到的是,在将元素压入栈的时候,将所有元素进行排序,比如压入元素的顺序为 {21,3,5,7,1},第一个压入21,第二个压入3的时候需要将21先取出,然后再压入3,再压入21,以此类推,但是这样并不符合时间复杂度为O(1)。
于是想到,使用一个成员变量,保存最小值。例如{21,3,5,7,1},当压入21的时候,最小值为21,压入3的时候,由于3比21小,则将最小值保存为3,以此类推。但如果需要得到次小值呢,是否再定义一个成员变量呢?
如果再想得到再比次小还小的一个元素呢?再定义一个成员变量保存么?
答案显然不是,这时候可以考虑用一个辅助栈来保存。
代码:
public class MinStack21 {
Stack<Integer> m_data ;
Stack<Integer> m_min;
public MinStack21() {
m_data =new Stack<>();
m_min = new Stack<>();
}
// 提取栈的第一个元素
public void pop() {
if (m_data.size() > 0 && m_min.size() > 0) {
m_min.pop();
m_data.pop();
}
}
// 将元素压入栈
public void push(int value) {
m_data.push(value); //不管有没有元素,value都进入栈
if (m_min.size() > 0) {
//System.out.println(m_min.size());
int min = m_min.peek();
// 如果最小栈的元素小于新元素,则在辅助栈中依然压入最小栈的栈顶元素
if (min < value)
m_min.push(min);
// 如果最小栈的栈顶元素大于value,则将value压入最小栈的栈顶
else
m_min.push(value);
} else {
m_min.push(value);
}
}
// 返回所有元素的最小值
public int min() {
int ans = Integer.MAX_VALUE;
if (m_min.size() > 0 && m_data.size()>0)
ans = m_min.pop();
return ans;
}
}