首页 > 其他分享 >LeetCode 155.最小栈(简单)

LeetCode 155.最小栈(简单)

时间:2022-11-25 13:37:16浏览次数:59  
标签:minStack 元素 最小 pop 栈栈 最小值 push 155 LeetCode

题目描述:

设计一个支持 ​​push​​​ ,​​pop​​​ ,​​top​​ 操作,并能在常数时间内检索到最小元素的栈。

  • ​push(x)​​ —— 将元素 x 推入栈中。
  • ​pop()​​ —— 删除栈顶的元素。
  • ​top()​​ —— 获取栈顶元素。
  • ​getMin()​​ —— 检索栈中的最小元素。

示例:

输入:
["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.

提示:

  • ​pop​​​ 、 ​​top​​ 和 ​​getMin​​ 操作总是在 非空栈 上调用。

题目分析:

这道题最简单的做法就是建立一个最小值栈,栈顶的元素代表基本栈里所有值中的最小值。首先看看压入操作,要往基本栈里压入一个元素,要检查最小值栈是否为空,如果最小值栈为空,证明基本栈也为空,所以要把这个元素一并压入最小值栈。当然如果最小值栈的栈顶元素大于等于要压入的元素时,就要更新最小值栈,把该元素即新的最小值元素压入最小值栈。再来看看弹出操作,如果最小值栈非空且最小值栈栈顶元素与基本栈栈顶元素相同,我们就先要弹出最小值栈栈顶元素,再弹出基本栈中的栈顶元素。最后获取基本栈所有元素中的最小值就是获取最小值栈栈顶元素的值了。

题解:

执行用时: 5 ms

内存消耗: 40 MB

class MinStack {

// 基本栈
Stack<Integer> stack;
// 最小值栈
Stack<Integer> minStack;

public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}

public void push(int val) {
// 把值压入基本栈
stack.push(val);
// 如果最小值值为空 或者 最小值栈顶元素大于等于当前值
if (minStack.empty() || minStack.peek() >= val) {
// 把当前元素压入最小值栈
minStack.push(val);
}
}

public void pop() {
// 当最小值栈非空 且 最小值栈栈顶元素与基本栈栈顶元素相同
if (!minStack.empty() && minStack.peek().equals(stack.peek())) {
// 先弹出最小值栈栈顶元素
minStack.pop();
}
// 弹出基本栈栈顶元素
stack.pop();
}

public int top() {
// 获取基本栈栈顶元素
return stack.peek();
}

public int getMin() {
// 获取基本栈最小元素即为获取最小值栈栈顶元素
return minStack.peek();
}
}

/**
* 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();
*/

题目来源:力扣(LeetCode)




标签:minStack,元素,最小,pop,栈栈,最小值,push,155,LeetCode
From: https://blog.51cto.com/u_15891283/5886563

相关文章

  • LeetCode 769.最多能完成排序的块(中等)
    题目描述:数组​​arr​​​是​​[0,1,...,arr.length-1]​​的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果......
  • LeetCode 240.搜索二维矩阵II(中等)
    题目描述:编写一个高效的算法来搜索 ​​m x n​​​ 矩阵​​matrix​​​中的一个目标值​​target​​。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的......
  • LeetCode 232.用栈实现队列(简单)
    题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(​​push​​​、​​pop​​​、​​peek​​​、​​empty​​):实现​​MyQueu......
  • LeetCode 448.找到所有数组中消失的数字(简单)
    题目描述:给你一个含​​n​​​个整数的数组​​nums​​​,其中​​nums[i]​​​在区间​​[1,n]​​​内。请你找出所有在​​[1,n]​​​范围内但没有出现......
  • LeetCode 48.旋转图像(中等)
    题目描述:给定一个​​n × n​​​的二维矩阵 ​​matrix​​​表示一个图像。请你将图像顺时针旋转​​90​​度。你必须在原地旋转图像,这意味着你需要直接修改......
  • LeetCode 260.只出现一次的数字III(中等)
    题目描述:给定一个整数数组​​nums​​,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。进阶:你的算法......
  • LeetCode 476.数字的补数(简单)
    题目描述:给你一个正整数​​num​​,输出它的补数。补数是对该数的二进制表示取反。示例1:输入:num=5输出:2解释:5的二进制表示为101(没有前导零位),其补数为010。所以......
  • LeetCode 693.交替位二进制数(简单)
    题目描述:给定一个正整数,检查它的二进制表示是否总是0、1交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。示例1:输入:n=5输出:true解释:5的二进制表示是:101示......
  • LeetCode 268.丢失的数字(简单)
    题目描述:给定一个包含​​[0,n]​​​中​​n​​​个数的数组​​nums​​​,找出​​[0,n]​​这个范围内没有出现在数组中的那个数。进阶:你能否实现线性时间......
  • LeetCode 338.比特位计数(简单)
    题目描述:给你一个整数​​n​​​,对于​​0<=i<=n​​​中的每个​​i​​​,计算其二进制表示中​​1​​​的个数,返回一个长度为​​n+1​​​的数组​......