《剑指offer》系列 包含min函数的栈(Java)

链接

牛客:包含min函数的栈

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

思路

我们需要实现四个函数 push(), pop(), top(), min(),我们借助两个栈来实现这样的功能。
其中一个就是正常的栈 onstack,还有一个是存放最小值的栈 minstack。
在每个函数中,正常的栈就正常保持原来那样操作,同时最小值栈也要进行相应的处理,

  • min() 函数返回的就是最小值栈的栈顶,我们只要保证 minstack 栈顶都是最小值就可以。
  • 当 push 的时候,我们首先判断 minstack 是否为空,为空的话将值 push,不然的话比较 min() 和当前值的大小,如果比 min() 还小,将值 push 进去,这样的话可以保证 minstack 栈顶最小。
  • 当 pop 的时候,我们要判断 minstack 和 onstack 的栈顶值是否一样,一样的话 minstack 也 pop,不然不作操作。

代码

牛客:

import java.util.Stack;

public class Solution {

    private Stack<Integer> onstack = new Stack<Integer>();
    private Stack<Integer> minstack = new Stack<Integer>();
    
    private int size;
    private int min = Integer.MAX_VALUE;
    public void push(int node) {
        if(minstack.isEmpty()){
        	minstack.push(node);
		} else if(node <= min()){			//这里一定要有等于号!!!
        	minstack.push(node);
        }
        onstack.push(node);
    }
    
    public void pop() {
    	int value = onstack.pop();
        //当普通栈的栈顶值和最小值一样  最小值栈弹出
    	if(value == min()){
    		minstack.pop();
    	}
    }
    
    public int top() {
        return onstack.peek();
    }
    
    public int min() {
        return minstack.peek();
    }
}

LeetCode:

class MinStack {

    private Stack<Integer> stack;

    private Stack<Integer> minStack;

    /** initialize your data structure here. */
    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }
    
    public void push(int x) {
        stack.push(x);
        if (minStack.isEmpty() || minStack.peek() >= x) {
            minStack.push(x);
        }
    }
    
    public void pop() {
        int x = stack.pop();
        if (!minStack.isEmpty() && minStack.peek() == x) {
            minStack.pop();
        }
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int min() {
        return minStack.peek();
    }
}

相似题

155. 最小栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值