LeetCode 155:最小栈

题目描述

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

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

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

解题思路

题目要求,以常数时间获取栈中最小值,最直观的感觉,将最小值始终放在栈顶,直接弹出速度最快!重点在压栈操作上,因为top方法要返回真实的栈顶元素,结合需求,每次push操作要压入两个元素。刚开始时,直接push两个相同的元素即可,之后,每次push操作,第一次先把元素push入栈,接着比较压入的元素和栈顶的最小元素的大小比较,如果栈顶最小元素大于压入的元素,则将其再次压入(更新最小值),否则,还将原来的最小值重新进行push操作。这样目的为了始终保持栈顶的元素就是最小元素。那top方法,只需弹出栈顶元素的下一个元素即可!

代码实现

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

import java.util.Stack;

public class minStack {
    //最小栈(只能借助一个栈)
    private Stack<Integer> data;

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

    public void push(int x){
        if (data.isEmpty()){//初始状态
            data.push(x);
            data.push(x);
        }else {
            int tmp=data.peek();//栈非空,查看栈顶元素
            data.push(x);//先将插入元素压栈
            if (tmp<x){//因为是最小栈,所以要始终将最小值放在栈顶(常数时间内,可以最快获取最小)
                data.push(tmp);
            }else {
                data.push(x);
            }
        }
    }

    public void pop(){
        data.pop();
        data.pop();
    }

    public int top(){
        return data.get(data.size()-2);
    }

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

    public static void main(String[] args) {
        minStack test=new minStack();
        test.push(3);
        test.push(1);
        test.push(5);
        test.push(0);
        System.out.println(test.getMin());
    }
}




总结

本题来源于Leetcode中 归属于类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!

觉得本博客有用的客官,可以给个赞鼓励下! 嘿嘿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值