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

98 阅读1分钟

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

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/ba… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

难点:栈的push和pop时间复杂度本身就是O(1),关键在于如何实现min。

思路

一个数据栈栈存储原数据,再用一个辅助栈来维护最小值

  • 数据栈正常存储元素即可

  • 辅助栈的栈顶元素就等于目前数据栈内的最小元素,因此每次新增元素只需要和辅助栈的栈顶元素相比较,如果比栈顶元素小,就入栈,每当调用min函数,直接弹出辅助栈的栈顶元素,时间复杂度为O(1)

函数设计

重点在于维护数据栈和辅助栈的数据一致

push函数

  1. 数据栈直接压入栈
  2. 辅助栈要判断是否小于等于栈顶元素或者栈内是否为空,如果是就压入栈

pop函数

  1. 数据栈直接出栈
  2. 辅助栈栈顶元素和数据栈出栈的元素是否相同,相同就出栈

min函数

  1. 直接返回辅助栈的栈顶元素即可

top函数

  1. 直接返回数据栈的栈顶元素即可

代码

class MinStack {
    LinkedList<Integer> stack;
    LinkedList<Integer> minStack;

    /** initialize your data structure here. */
    public MinStack() {
        stack = new LinkedList<>();
        minStack = new LinkedList<>();
    }
    
    public void push(int x) {
        stack.push(x);
        if(minStack.isEmpty()||x <= minStack.peek()){
            minStack.push(x);
        }
    }
    
    public void pop() {
        if(stack.pop().equals(minStack.peek())){
            minStack.pop();
        }
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int min() {
        return minStack.peek();
    }
}