力扣练习之最小栈

我爱海鲸 2022-10-06 20:16:53 初级算法

简介初级算法、设计问题

原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnkq37/

解法一:

class MinStack {

    private ListNode listNode;

    public MinStack() {

    }
    
    public void push(int val) {
        if (listNode == null) {
            listNode = new ListNode(val,val,null);
            return;
        }
        int min = Math.min(val,listNode.min);
        listNode = new ListNode(val,min,listNode);
    }
    
    public void pop() {
        listNode = listNode.next;
    }
    
    public int top() {
        return listNode.val;
    }
    
    public int getMin() {
        return listNode.min;
    }
}

class ListNode {
    int val;
    int min;
    ListNode next;

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

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

思路:定义一个自定义的链表,栈的特点是"先进后出",那么我们只需要每次将链表的新节点作为链表的头结点.并在每一次入栈的时候记录当前的最小值.出栈将头结点的引用指向下一个节点即可.获取顶部数据和获取最小值,使用头节点记录的数据即可.

解法二:

class MinStack {
    // 第一个记录栈的数据
    Stack<Integer> stack1 = new Stack();
    // 第二个栈记录栈的最小值
    Stack<Integer> stack2 = new Stack();

    public MinStack() {

    }
    
    public void push(int val) {
        stack1.push(val);
        // 如果第二个栈中的数据为空或者入栈的值要小于当前的最小值,就将当前入栈的值入栈到第二个栈中
        if (stack2.empty() || val <= getMin()) {
            stack2.push(val);
        }
    }
    
    public void pop() {
        // 将第一个栈中的数据出栈,并比较当前的最小值,如果当前的最小值等于当前出栈的数据,就将当前第二个记录最小值得栈进行出栈
        if (stack1.pop() == getMin()) {
            stack2.pop();
        }
    }
    
    public int top() {
        // 获取第一个记录数据的栈顶元素
        return stack1.peek();
    }
    
    public int getMin() {
        // 获取第二个记录最小值得栈顶元素
        return stack2.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(val);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

思路:使用官方提供的Stack,我们使用两个栈分别记录当前的入栈元素和当前 入栈元素中的最小值.每一次出入栈都操作这两个定义的栈数据即可.

你好:我的2025