题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
牛客链接:
https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49?tpId=13&&tqId=11173&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
解题思路:
用一个栈data保存数据,用另外一个栈min保存依次入栈最小的数
比如,data中依次入栈,5, 4, 3, 8, 10, 11, 12, 1
则min依次入栈,5, 4, 3,3,3, 3, 3, 1
每次入栈的时候,如果入栈的元素比min中的栈顶元素小或等于则入栈该值,否则入栈min的栈顶元素。
代码:
push时间复杂度o(1),pop时间复杂度o(1),需要辅助栈空间复杂度o(n)
class Solution {
public:
stack<int> stk1,stk2;
void push(int value) {
stk1.push(value);
//当新插入的值比stk2的栈顶小时,将新插入的值push进stk2
if(stk2.empty() || stk2.top() > value) {
stk2.push(value);
} else {
//当新插入的值比stk2的栈顶大时,将stk2的头再次push进stk2
stk2.push(stk2.top());
}
return;
}
void pop() {
stk1.pop();
stk2.pop();
}
int top() {
return stk1.top();
}
int min() {
return stk2.top();
}
};
注意:
栈的特性