155. Min Stack ——easy, stack

原题链接

思路

还没读完题时第一反应是最小堆,然而不符合题意。题意是要实现一个普通的栈,外加一个getMin()的功能。
思路是使用两个栈,一个是普通的栈,另一个栈放当前最小值。

class MinStack {

    private Deque stack1 = new ArrayDeque<>();
    private Deque stack2 = new ArrayDeque<>();

    /** initialize your data structure here. */
    public MinStack() {

    }

    public void push(int x) {
        stack1.push(x);

        if (stack2.isEmpty()) {
            stack2.push(x);
        } else {
            Integer peek = stack2.peek();
            if (peek < x) {
                stack2.push(peek);
            } else {
                stack2.push(x);
            }
        }
    }

    public void pop() {
        stack1.pop();
        stack2.pop();
    }

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

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

155. Min Stack ——easy, stack_第1张图片

改进

可以改进的地方是,存储空间,存放最小值的栈中有很多重复的数字。
观察下面的图,最小值在什么时候发生变化?是在遇到更小的值时。可以这样做,用一个栈存储,内存中有个变量存储当前最小值,当栈顶元素等于当前最小值时,说明最小值发生了变化,上一个最小值存在栈中。
变量min存储最小值,按普通的栈,入栈,如果最小值变化了,就把min压入栈,然后元素入栈。
155. Min Stack ——easy, stack_第2张图片


class MinStack {

    private Deque stack = new ArrayDeque<>();
    private int min;

    /** initialize your data structure here. */
    public MinStack() {
        min = Integer.MAX_VALUE;
    }

    public void push(int x) {
        if (x <= min) {
            stack.push(min);
            min = x;
            stack.push(x);
        } else {
            stack.push(x);
        }
    }

    public void pop() {
        if (stack.peek() == min) {
            stack.pop();
            min = stack.pop();
        } else {
            stack.pop();
        }
    }

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

    public int getMin() {
        return min;
    }
}

为什么结果还不如两个栈?算了,就这样吧。
155. Min Stack ——easy, stack_第3张图片

思路2

自己实现栈,用链表,节点中存放数值和最小值。

class MinStack {

    class ListNode {
        ListNode next;
        int val;
        int min;
        public ListNode(int val, int min) {
            this.val = val;
            this.min = min;
        }
    }

    private ListNode head;

    /** initialize your data structure here. */
    public MinStack() {

    }

    public void push(int x) {
        if (head == null) {
            head = new ListNode(x, x);
        } else {
            ListNode node = new ListNode(x, Math.min(x, head.min));
            node.next = head;
            head = node;
        }
    }

    public void pop() {
        head = head.next;
    }

    public int top() {
        return head.val;
    }

    public int getMin() {
        return head.min;
    }
}

你可能感兴趣的:(leetcode题解)