程序员社区

剑指Offer系列(java版,详细解析)30.包含min函数的栈

题目描述

剑指 Offer 30. 包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.

提示:

  1. 各函数的调用总次数不超过 20000 次

测试用例

  • 新压入栈的数字比之前的最小值大。
  • 新压入栈的数字比之前的最小值小。
  • 弹出栈的数字不是最小元素。
  • 弹出栈的数字是最小元素。

题目考点

  • 考察应聘者分析复杂问题的思维能力——举例分析。
  • 考察应聘者对栈的理解。

解题思路

这里只限制了时间复杂度,没限制空间复杂度,我们可能会想到用辅助栈。

然后我们就会想到用一个栈来保存最小值,具体怎么保存?

我们可以每次在辅助栈都压入当前数据栈的最小值。在执行min函数的时候直接取到辅助栈的栈顶元素即可,当执行push函数时,如果压入的元素比当前最小值小则压入辅助栈,不然再压入一个当前最小值(为了pop的方便),在执行pop函数时,我们只要直接弹出数据栈与辅助栈的栈顶元素就好。

参考解题

class MinStack {
   
        Stack<Integer> stack1 ;
        Stack<Integer> stack2 ;  
    /** initialize your data structure here. */
    public MinStack() {
   
     stack1 = new Stack();
     stack2 = new Stack();        
    }

    public void push(int x) {
   
        if(stack2.isEmpty() || stack2.peek()>=x)
            stack2.push(x);
        stack1.push(x); 

    }

    public void pop() {
   
        if(!stack2.isEmpty() && stack1.peek()<=stack2.peek())
            stack2.pop();
        stack1.pop();
    }

    public int top() {
   
        return stack1.isEmpty() ? 0 : stack1.peek();
    }

    public int min() {
   
        return stack2.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(); */
赞(0) 打赏
未经允许不得转载:IDEA激活码 » 剑指Offer系列(java版,详细解析)30.包含min函数的栈

一个分享Java & Python知识的社区