294、最小栈

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

实现 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.

  

提示:

-231 <= val <= 231 1

pop、top 和 getMin 操作总是在 非空栈 上调用

push, pop, top, and getMin最多被调用 3 104 

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/min-stack

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.collection;

import java.util.ArrayList;

import java.util.List;

/**

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

 *

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

 *

 * 来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 *

 * 思考:官方解法,看了,用2个栈,确实很妙;但是,感觉这样的解法有点无耻啊,充分利用题目的不确定性。

 * 很多题目描述的不够清楚,用2个栈去实现1个栈,这不是瞎折腾吗?实际工作中,有几个这样的需求。

 * @author wen.lei@brgroup.com

 *

 *         2022-2-18

 */

public class MinStack {

    private List<Integer> elementList = new ArrayList<>();

    private Integer min = null;

    /*示例:

     

        输入:

        ["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.*/

    public MinStack() {

    }

    //每次push和pop时,更新min

    public void push(int val) {

        elementList.add(val);

        if(min!=null) {

            min = Math.min(min, val);

        }else {

            min=val;

        }

        

    }

    public void pop() {

        if (elementList.isEmpty()) {

            return;

        }

        Integer removed=elementList.remove(elementList.size() - 1);

        if(removed.equals(min)) {

            refreshMin();

        }

    }

    private void refreshMin() {

        min=min(elementList);

    }

    private Integer min(List<Integer> elementList) {

        if(elementList==null||elementList.size()==0) {

            return null;

        }

        Integer min=elementList.get(0);

        for(Integer num:elementList) {

            min=Math.min(min, num);

        }

        return min;

    }

    public int top() {

        if (elementList.isEmpty()) {

            throw new IllegalArgumentException("no element");

        }

        return elementList.get(elementList.size() - 1);

    }

    public int getMin() {

        return min;

    }

    /**

     * 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();

     */

}

package test.leecode.collection;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.collection.MinStack;

/**

 * @author wen.lei@brgroup.com

 *

 *         2022-2-25

 */

public class MinStackTest {

    @Test

    public void test() {

        MinStack test = new MinStack();

        test.push(-2);

        test.push(0);

        test.push(-3);

        Assert.assertEquals(-3, test.getMin());

        test.pop();

        Assert.assertEquals(-2, test.getMin());

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值