感谢耶稣,笔者又过了一天“复活节”。月末斩杀一道Hard画上句号
题型:栈、模拟数据结构
链接:155. 最小栈 - 力扣(LeetCode)
来源:LeetCode
题目描述
设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
-
MinStack()
初始化堆栈对象。 -
void push(int val)
将元素val推入堆栈。 -
void pop()
删除堆栈顶部的元素。 -
int top()
获取堆栈顶部的元素。 -
int getMin()
获取堆栈中的最小元素。
题目样例(不太建议看样例)
示例 1:
输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,null,-3,null,0,-2] 解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
提示:
-231 <= val <= 231 - 1
-
pop
、top
和getMin
操作总是在 非空栈 上调用 -
push
,pop
,top
, andgetMin
最多被调用3 * 104
题目思路
笔者用了两个栈,一个处理数值val,一个处理最小值
明天细说(感谢耶稣)耶稣都复活了哈哈哈
讲一下思路:因为题目要求是:pop()函数弹出val,但是getMin()函数是“返回”最小值(不改变栈内元素)。这就很人性化了(要是让弹出最小值会累死人的)
那就可以用两个栈来实现(第一行),其中为了便于min_stack<int>压入第一个元素,提前在构造函数那里压入INT_MAX(或者先压入一个val)。
C++代码
class MinStack {
private:
stack<int> sup_stack;//辅助栈,负责存数值
stack<int> min_stack;//“最小栈”用的栈结构,负责存当前的最小值
public:
MinStack() {
// 这个是最小栈的构造函数
min_stack.push(INT_MAX);//这样当栈为空时,就可以将val放进来
}
// 相当于是重写了栈的函数
void push(int val) {
sup_stack.push(val);
//看栈顶元素 和 将要进来的元素哪个小,存入更小的那一个(保持栈顶元素一直最小)
min_stack.push(min(val,min_stack.top()));
}
void pop() {
sup_stack.pop();
min_stack.pop();
}
int top() {
return sup_stack.top();
}
int getMin() {
return min_stack.top();
}
};
/**
* 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();
*/