题目

最小栈
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。

思路

  • 最先的思路是使用 List 作为模拟栈的容器,通过使用 index 角标记录入栈出栈的位置,每次栈元素变化重新定位最小值 min,代码提交执行9ms
  • 题解最快是使用双向链表做,看一下思路,确实快,原因在于节点按顺序存储了当前值与最小值,每次入栈出栈操后不涉及额外的定位最小值,示意 node(当前值,最小值)node(1,1)->node(2,1)->node(-1,-1)->node(-2,-2)

关键

node节点既存储当前值,又存储最小值,最小值随链表有序递减

代码

package leetcode.stack;

import java.util.ArrayList;
import java.util.List;

/**
 * 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
 * <p>
 * push(x) -- 将元素 x 推入栈中。
 * pop() -- 删除栈顶的元素。
 * top() -- 获取栈顶元素。
 * getMin() -- 检索栈中的最小元素。
 * <p>
 * 示例:
 * MinStack minStack = new MinStack();
 * minStack.push(-2);
 * minStack.push(0);
 * minStack.push(-3);
 * minStack.getMin();   --> 返回 -3.
 * minStack.pop();
 * minStack.top();      --> 返回 0.
 * minStack.getMin();   --> 返回 -2.
 */

class Node {
    public Node pre;
    public Node next;
    public int value;
    public int min;
}

class MinStack2 {

    Node top = null;

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

    }

    public void push(int x) {
        Node node = new Node();
        node.value = x;
        if (top == null) {
            node.min = x;
        } else {
            if (top.min < x) {
                node.min = top.min;
            } else {
                node.min = x;
            }
        }
        node.pre = top;
        top = node;
    }

    /**
     * top永远指向栈顶
     * 第一个 if 判断栈是不是已经空了,空栈就没有pre节点
     * 第二个 if 判断栈是不是已经空了,不是空栈就删除next节点,断链
     */
    public void pop() {
        if (null != top) {
            top = top.pre;
            if (null != top) {
                top.next = null;
            }
        }
    }

    public int top() {
        if (null != top) {
            return top.value;
        } else {
            return -1;
        }
    }

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


public class N155_2 {
    public static void main(String[] args) {
        MinStack2 minStack = new MinStack2();
        minStack.push(2147483646);
        minStack.push(2147483646);
        minStack.push(2147483647);
        System.out.println(minStack.top());
        minStack.pop();
        System.out.println(minStack.getMin());
        minStack.pop();
        System.out.println(minStack.getMin());
        minStack.pop();
        minStack.push(2147483647);
        System.out.println(minStack.top());
        System.out.println(minStack.getMin());
        minStack.push(-2147483648);
        System.out.println(minStack.top());
        System.out.println(minStack.getMin());
        minStack.pop();
        System.out.println(minStack.getMin());
    }
}

哒哒队长
7 声望4 粉丝