剑指 Offer 30. 包含min函数的栈

题目

在这里插入图片描述

题目链接

https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/

解题思路

题目理解

min(): 返回栈中的最小值
push(x): 压入一个参数 x 入栈
pop(): 弹出栈顶元素并返回
top(): 返回栈顶元素
 
min,push,pop 时间复杂度O(1): 意味着这三个方法中不能进行递归操作,代码执行一次就该获取到数据

具体思路

准备两个 Stack 栈,一个存储全量数据,一个存储最小值的栈,越接近栈顶,值越小。
 
push() 时,全量数据栈中直接入栈,最小值栈仅在 push() 的数据小于等于栈顶的数据才入栈。
 
为什么仅数据小于等于栈顶的数据才入最小值栈?因为大于的数据入栈无意义,且栈顶数据就是当前栈中的最小值。大的数据不出栈,小的数据也无法出栈,因此大数据丢弃即可。
 
等于情况下为什么也要入最小栈?假如我 push() 了两个 3,接着执行 pop() ,最小栈也要 pop()。此时最小的值还是 3,如果最小栈只设置了一次 3,此时最小栈就没数据了。

具体代码

class MinStack {

    /**
     * 栈
     */
    private final Stack<Integer> stack;

    /**
     * 最小栈
     */
    private final Stack<Integer> minStack;

    /** initialize your data structure here. */
    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int x) {
        stack.add(x);
        // 仅在 push() 的值,大于等于最小值时,添加入最小值栈
        if (minStack.isEmpty() || minStack.peek() >= x) {
            minStack.add(x);
        }
    }

    public void pop() {
        if (!stack.isEmpty() && !minStack.isEmpty() && stack.peek().equals(minStack.peek())) {
            minStack.pop();
        }
        stack.pop();
    }

    public int top() {
    	// 不管
        if (stack.isEmpty()) {
            return 0;
        }
        return stack.peek();
    }

    public int min() {
        if (minStack.isEmpty()) {
            return 0;
        }
        return minStack.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.min();
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值