Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例
示例1:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
提示
- 各函数的调用总次数不超过 20000 次
难度:简单
此题为简单题,兄弟们可以重拳出击!
二、思路分析
众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。
题目解析
- 定义一个包含 min 函数的栈数据结构,拥有 min 函数的栈,不仅可以进行入栈、出栈、获取栈顶元素等操作,还可以使用 min 函数返回栈中元素的最小值。
- 根据栈结构先进后出的特点,单个栈的顺序要求无法满足获取当前栈中最小值的需求,因此考虑增加其他容器。
- 获取栈最小值的函数只是获取,不会对栈中元素进行任何操作,可以使用一个额外的栈来记录当前栈中最小值
- 如果后续入栈元素比当前栈顶元素小,则同时入最小值栈
- 如果入栈元素比当前栈顶元素大,此时最小值不变,不会进行入栈操作
- 获取最小值时直接从最小值栈获取栈顶元素
- 元素出栈时,如果栈顶元素与最小值栈顶元素相等,则最小值栈需要同步出栈该元素
三、AC 代码
- 代码定义类结构说明
/**
* Your MinStack object will be instantiated and called as such:
*/
MinStack obj = new MinStack();
obj.push(x);
obj.pop();
int param_3 = obj.top();
int param_4 = obj.min();
- 逻辑代码
class MinStack {
/** initialize your data structure here. */
Stack<Integer> stack, stackMin;
public MinStack() {
stack = new Stack<>();
stackMin = new Stack<>();
}
public void push(int x) {
//入栈,如果当前值小于等于最小栈栈顶元素,说明为最小值,入最小栈
stack.push(x);
if(stackMin.isEmpty() || x <= stackMin.peek()){
stackMin.push(x);
}
}
public void pop() {
//出栈,如果栈顶元素等于最小栈栈顶元素,则同时出栈
if(!stack.isEmpty()){
int cur = stack.pop();
if(cur == stackMin.peek()){
stackMin.pop();
}
}
}
public int top() {
//栈顶,即获取正常栈栈顶元素
if(stack.isEmpty()) return -1;
return stack.peek();
}
public int min() {
//最小值,获取最小栈栈顶元素
if(stackMin.isEmpty()) return -1;
return stackMin.peek();
}
}
四、总结
知识点
- 栈初始化方法:
new Stack(); - 栈判空方法:
stack.isEmpty(); - 入栈/出栈方法:
stack.push(e);,stack.pop(); - 获取栈顶元素(不出栈):
stack.peek();
最后
阳春三月,算法刷起来!LeetCode 剑指 Offer。
简单题,不需要考虑太多,开干就是了。