294最小栈

Posted huoyingfans

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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());

    

以上是关于294最小栈的主要内容,如果未能解决你的问题,请参考以下文章

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

LeetCode最小栈问题的最优解法+代码实现

LeetCode最小栈问题的最优解法+代码实现

[LeetCode][13]Roman to Integer解析 罗马字符转int类型关于栈的常数实现-Java实现

[LeetCode][13]Roman to Integer解析 罗马字符转int类型关于栈的常数实现-Java实现

LeetCode155-最小栈(优先队列/巧妙的解法)