【算法训练】LeetCode#15 最小栈

一、描述

155. 最小栈

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

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例 1:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

二、思路

想简单了,本来想着用一个int变量存min值就行了...不把中等难度当中等...

  • 方法一:用两个stack,一个是正常存储数据的stack,一个是存储插入时的最小值的minStack,当stack.pop时,minStack与之同步即可。
  • 方法二:法一借助了额外空间,如果不借助额外空间也能做,但是不太好理解。每次插入时计算插入元素与当前最小值的差,将差存入栈中,pop或top元素时利用minValue计算真实值。

三、解题


public static class MinStack {

    Stack<Integer> stack;
    Stack<Integer> minStack;
    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val) {
        stack.push(val);
        int curMin = minStack.isEmpty() ? val : minStack.peek();
        minStack.push(Math.min(curMin, val));
    }

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

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

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

public static class MinStackV2 {

    Stack<Long> stack; // 存储元素与最小值的差
    long minVal;
    public MinStackV2() {
        stack = new Stack<>();
    }

    public void push(long val) {
        if (stack.isEmpty()){
            // 如果栈空,则
            stack.push((long) 0);
            minVal = val;
        } else {
            long tmp = val - minVal;
            stack.push(tmp);
            minVal = tmp > 0 ? minVal : val;
        }
    }

    public void pop() {
        long tmp = stack.pop();
        minVal = tmp > 0 ? minVal : minVal-tmp;
    }

    public long top() {
        long tmp = stack.peek();
        return tmp > 0 ? minVal+tmp : minVal;
    }

    public long getMin() {
        return minVal;
    }
}
posted @ 2023-01-04 16:38  小拳头呀  阅读(11)  评论(0编辑  收藏  举报