题目链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(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 次
【相关题目】:
注意:本题与主站 155. 最小栈 题目相同。
时间复杂度O(1),空间复杂度O(2n)
解题思路:
题目要求定义一个栈的数据结构,并使得min
、push
及pop
的时间复杂度都是 O(1),由于栈是一种后进先出的数据结构,所以要想保证min
的时间复杂度为O(1),就必须让最小值始终位于栈顶元素。
实现策略:
因为涉及到数据元素的进出栈问题,我们不能通过简单的在栈中定义一个成员变量的方式来记录最小值,因为当最小值一旦出栈,你就很难再去以O(1)的时间复杂度去找到次小值。所以正确的策略,应该是通过一个辅助栈,在正常的数据栈normal
元素压栈时,记录最小值的数据栈min
对当前压栈值进行判断,将更小值压入栈内;出栈时,两栈同时弹出,这样就能保证当前栈中的最小值始终处于min的栈顶位置,保证了min方法的O(1)复杂度。
class MinStack {Stack normal;Stack min;/** initialize your data structure here. */public MinStack() {normal = new Stack<>();min = new Stack<>();}public void push(int x) {normal.push(x);if (min.size() == 0 || x < min.peek()) min.push(x);else min.push(min.peek());}public void pop() {normal.pop();min.pop();}public int top() {return normal.peek();}public int min() {return min.peek();}
}/*** 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 {Stack A, B;public MinStack() {A = new Stack<>();B = new Stack<>();}public void push(int x) {A.add(x);if(B.empty() || B.peek() >= x)B.add(x);}public void pop() {if(A.pop().equals(B.peek()))B.pop();}public int top() {return A.peek();}public int min() {return B.peek();}
}
[1] 面试题30. 包含 min 函数的栈(辅助栈,清晰图解)-- 图片与简化题解来源
上一篇:哪款蓝牙耳机适合学生党用?便宜质量又好的学生蓝牙耳机
下一篇:位运算及负数的表示