【LeetCode刷题记录】23.栈的最小值

146 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode-栈的最小值

请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。

示例:

MinStack minStack = new MinStack();

minStack.push(-2);

minStack.push(0);

minStack.push(-3);

minStack.getMin(); --> 返回 -3.

minStack.pop();

minStack.top(); --> 返回 0.

minStack.getMin(); --> 返回 -2.

二、思路分析:

思路一: 在原本节点类内多写入一个节点备用

每次push时比较当前数据与目前最小值的比较,若为最小值则替换当前min节点,并将原来的min节点作为目前节点的nextmin

删除时若删除的是最小值则将min节点替换为min.nextmin即可,相当于保存了两条链,一条栈的链以及最小值的链。

思路二:

使用一个辅助栈,内部保存元素的个数和数据栈完全一样

辅助栈内部永远保存本次入栈的数为所有数据的最小值

三、AC 代码:

思路一:


    class MinStack {

        Node minNode;
        Node firstNode;
        Node nextNode;

        class Node {
            Node next, nextmin;
            int x;

            Node(int x) {
                this.x = x;
            }
        }

        public MinStack() {
            Node first = null;
            Node next = null;
            Node min = null;
        }

        public void push(int x) {
            Node tempNode = firstNode;
            firstNode = new Node(x);
            firstNode.next = tempNode;
            if (minNode == null || minNode.x > firstNode.x) {
                firstNode.nextmin = minNode;
                minNode = firstNode;
            }
        }

        public void pop() {
            if (firstNode == minNode) minNode = firstNode.nextmin;
            firstNode = firstNode.next;
        }

        public int top() {
            return firstNode.x;
        }

        public int getMinNode() {
            return minNode.x;
        }
    }

思路二:

    class MinStack {
        private Stack<Integer> dataStack = new Stack<>();
        private Stack<Integer> minStack = new Stack<>();

        public void push(int x) {
            dataStack.push(x);
            if (minStack.empty() || x < minStack.peek()) minStack.push(x);
            else minStack.push(minStack.peek());

        }

        public void pop() {
            dataStack.pop();
            minStack.pop();
        }

        public int top() {
            return dataStack.peek();
        }

        public int getMin() {
            return minStack.peek();
        }
    }