目录
每日一句
风可以吹起一张大白纸,却无法吹走一只蝴蝶,因为生命的力量不在于顺从
作者简介
🏡个人主页:XiaoChen_Android
📚学习专栏:力扣专栏
🕒发布日期:2022/8/20
『LeetCode|每日一题』 最小栈
1.每日一题
2.解题思路 (方法一)
2.1 思路分析
此题如果定义一个辅助栈处理起来会方便很多,当然也可以不用辅助栈,这里我选择用一个辅助栈
分析:如果栈里面本来有a,b两个元素,现在又有一个元素c入栈,那么只要当c在栈中时,a和b一定在栈中,利用这个,我们可以定义一个辅助栈,它的作用是存每次元素入栈之后的最小值,元素可以相等。值得注意的是,元素的插入和删除两个栈需同步操作;
S1:定义两个栈,在MinStack中进行初始化,对于辅助栈,由于是存最小值的,我们可以事先入栈一个很大的值;
S2:入栈操作push:对于数据栈,直接入栈就好了,但是对于辅助栈,要选择入栈元素和原本辅助栈中的最小值中更小的那个;
S3:对于出栈,两个栈直接把栈顶元素出栈就好了;
S4:取栈顶元素但是不出栈:直接在数据栈中peek()就好了,它返回栈顶元素值但是不删除元素;
S5:取最小值:在辅助栈中取栈顶元素就好了,即minData.peek();
2.2 图解
2.3 完整代码
class MinStack {
Stack<Integer> data;
Stack<Integer> minData;
public MinStack() {
data = new Stack<>();
minData = new Stack<>();
minData.push(Integer.MAX_VALUE);
}
public void push(int val) {
data.push(val);
minData.push(Math.min(val , minData.peek()));
}
public void pop() {
data.pop();
minData.pop();
}
public int top() {
return data.peek();
}
public int getMin() {
return minData.peek();
}
}
2.4 运行结果
3.解题思路(方法二---不利用辅助栈)
3.1 思路分析
分析:与不利用辅助栈的区别就是,每次入栈的有两个元素,一个是元素本身,另一个是当前栈元素的最小值,举个例子,入栈序列为1,3,0,则入栈后栈中的元素序列为1-1-3-1-0-0;
S1:对于初始化栈就是有一个栈了,很简单和第一种方法一样
S2:入栈操作(push):要分情况讨论,如果此时栈是空的,那么直接把该元素两次入栈即可,如果栈不为空,则要先取栈顶元素不删除该元素,就是当前栈元素的最小值,先把该元素入栈,然后和当前栈元素的最小值比较,入栈较小的那个;
S3:对于pop操作,即对栈进行两次出栈即可;
S4:要取出当前栈顶的元素且不删除该元素,即要获得stack.size() - 2位置的元素,因为栈顶为当前栈元素最小值;
S5:对于取最小值,直接去栈顶元素即可
3.2 完整代码
class MinStack {
Stack<Integer> data;
public MinStack() {
data = new Stack<>();
}
public void push(int val) {
if(data.empty() == true){
data.push(val);
data.push(val);
}else {
int temp = data.peek();
data.push(val);
data.push(Math.min(val , temp));
}
}
public void pop() {
data.pop();
data.pop();
}
public int top() {
return data.get(data.size() - 2);
}
public int getMin() {
return data.peek();
}
}
3.3 运行结果
🍁 类似题目推荐:
如果文章对你有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!