好久没刷题了,最近刷题见到这个一个题,题目本身很简单,做一个辅助栈,时间效率跑过100%的用户,但是在讨论区看到 一次面试的时候,面试官要求不开辅助栈的做法,感觉这个值得思考。做法是在栈内记录一个最小值,同时栈内存储于最小值的差值。但任然离不开栈的先进后出性质。
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/*
* @lc app=leetcode.cn id=155 lang=cpp
*
* [155] 最小栈
*/
// @lc code=start
class MinStack {
public:
//最简单的做法是开辟辅助栈 最小栈
//面试的时候曾经有个不开辟辅助空间的要求:
//做法是栈里存差值
//启发思路是单调栈
stack<long long> x_stack;
stack<int> min_stack;
long long min_val;
MinStack() {
//min_val = -1;
}
void push(long long val) {
if(x_stack.size() == 0) {
// 当前栈空
min_val = val;
x_stack.push(0);
}
else {
long long diff = val - min_val;
x_stack.push(diff);
if(diff < 0) min_val = val;// 取代最小值
}
//cout << min_val << endl;
}
void pop() {
long long diff = x_stack.top(),ret;
if(diff < 0) {
ret = min_val;
min_val = ret - diff; // 还原最小值
}
else {
}
x_stack.pop();
}
long long top() { // 取top 不改pop
long long diff = x_stack.top(),ret;
if(diff >= 0) ret = min_val + diff;
else ret = min_val; // diff < 0 当前栈顶就是最小值
return ret;
}
long long getMin() {
return min_val;
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
// @lc code=end