剑指 Offer 30. 包含min函数的栈
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
1、题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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 次
2、思路
拿到题目我们会会有第一思路,利用栈去解决问题,但是在第一次的提交会发现一些问题,我们该如何去记录弹出的时候,也让该最小元素也弹出,所以 我们需要解决这个问题。
首先思路是利用两个栈来解决该问题
- 数栈:用于存储所有元素,保证入栈push() 函数、出栈pop() 函数、获取栈顶top()函数
- 最小数栈:存储栈数栈中所有降序的元素,则数栈中的最小的元素始终对应最小栈的栈顶元素,即min()函数只需返回最小栈的栈顶元素。
所以,设法维护好最小栈的元素,使其保持非严格降序,即可实现min() 函数的0(1)复杂度。
数组同栈的思路相同,只不过是换了一种存储的方法。
废话少说 ~~~~~ 上代码!
3、代码
使用栈
import java.util.Stack;
class MinStack {
Stack<Integer> numsStack, minStack;
public MinStack() {
numsStack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
numsStack.add(x);
if(minStack.empty() || minStack.peek() >= x)
minStack.add(x);
}
public void pop() {
if(numsStack.pop().equals(minStack.peek()))
minStack.pop();
}
public int top() {
return numsStack.peek();
}
public int min() {
return minStack.peek();
}
}
使用数组来模拟栈
import java.util.Stack;
class MinStack {
Stack<Integer> stack;
int mins[] = new int [20005];
int index = 0;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
}
public void push(int x) {
stack.push(x);
if(index==0){
mins[++index] = x;
}else{
mins[++index] = Math.min(mins[index-1], x);
}
}
public void pop() {
stack.pop();
mins[index--] = 0;
}
public int top() {
return stack.peek();
}
public int min() {
return mins[index];
}
}
/**
* 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();
*/
4、总结
该题目的最大难度在于如何将 min() 函数复杂度降为 O(1) ,我们可以建立辅助空间,来实现次功能。可以用栈、也可以用数组来实现。
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!