一、题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
解题思路
- 要实现算法的时间复杂度为O(1),常规的排序算法无法达到;
- 另外考虑只需选出最小的元素,因此可通过没一个进来与前一个比较,始终存储最小的值来进行实现。
- 通过增加一个辅助栈,用于存储最小的值,可以实现。
- 针对下列代码的实现,举例如下:
假设有元素 3, 2, 5, 4, 2, 1依次入栈,则原始栈中元素为和辅助栈元素的值如下表格所示
原始栈data | 辅助栈minval |
---|---|
3 | 3 |
3 , 2 | 3 , 2 |
3, 2, 5 | 3, 2, 2 |
3, 2, 5, 4 | 3, 2, 2, 2 |
3, 2, 5, 4, 2 | 3, 2, 2, 2, 2 |
3, 2, 5, 4, 2, 1 | 3, 2, 2, 2, 2, 1 |
另外,当执行pop出栈操作时,因辅助栈和原始数据栈中数据量是一样的,则同时挤出一个元素,minval栈的栈顶仍然是新的原始栈中元素的最小值
二、实现代码
class Solution {
public:
void push(int value) {
data.push(value);
//如果minval这个栈初始的时候为空,则存入一个数;否则需要将新的数与minval栈顶的数进行比较,将二者中小的这个存到栈中
if(minval.empty()){
minval.push(value);
}
else{
value < minval.top()? minval.push(value) : minval.push(minval.top());
}
}
//当执行出栈操作时,数据栈data和辅助栈minval同时将栈顶元素出栈
void pop() {
minval.pop();
data.pop();
}
int top() {
return data.top();
}
//minval 栈顶存储的数是找到的最小的数
int min() {
return minval.top();
}
private:
stack<int> data,minval;
};