原题网址:https://www.lintcode.com/zh-cn/problem/min-stack/#
实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。
你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。
样例
如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1
标签
思路:可以创建两个数组,一个保存栈数据,另一个保存当前栈的最小值。栈数据数组不用说,入栈出栈直接操作即可。
最小值数组,新元素入栈时判断当前最小值(栈顶)与新元素哪个小,较小者压入最小值数组。元素出栈时,最小值数组删掉最后一个元素即可,两个数组始终等长。
min函数可以直接返回最小值数组最后一个元素,该值为当前栈最小值。
AC代码:
class MinStack {
public:
MinStack() {
// do intialization if necessary
}
/*
* @param number: An integer
* @return: nothing
*/
void push(int number) {
// write your code here
m_iAarray.push_back(number);
if (minVal.empty()||number<minVal.back())
{
minVal.push_back(number);
}
else
{
minVal.push_back(minVal.back());
}
}
/*
* @return: An integer
*/
int pop() {
// write your code here
int temp;
if (!m_iAarray.empty())
{
temp=m_iAarray.back();
m_iAarray.pop_back();
}
if (!minVal.empty())
{
minVal.pop_back();
}
return temp;
}
/*
* @return: An integer
*/
int min() {
// write your code here
return minVal.back();
}
vector<int> m_iAarray;
vector<int> minVal;
};
参考:https://www.cnblogs.com/theskulls/p/5098271.html
另一种思路,用两个栈,一个保存数据,一个保存当前最小值,效率更高。参考:https://blog.csdn.net/ljlstart/article/details/48517703
这种方法当入栈时,判断新元素是否小于或等于当前最小值(最小值栈栈顶),小于等于则push新值更新最小值栈,否则维持原样。
删除元素时判断要删除的值是否是当前最小值,如果是,最小值栈删除当前栈顶,更新最小值。