栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

leetcode 155:最小栈

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetcode 155:最小栈

leetcode 155:最小栈

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

push(x) —— 将元素 x 推入栈中。

pop() —— 删除栈顶的元素。

top() —— 获取栈顶元素。

getMin() —— 检索栈中的最小元素。

示例:

输入:
["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.

提示:

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

Related Topics

设计

思路1:暴力法
class MinStack {
    int[] stack = new int[10000];
    int last = -1;
​
    public MinStack() {
​
    }
    
    public void push(int val) {
        stack[++last] = val;
    }
    //因为操作都是在非空栈进行
    public void pop() {
        last--;
    }
    
    public int top() {
        return stack[last];
    }
    
    public int getMin() {
        int min = stack[0];
        for(int i = 1 ; i <= last;i++){
            if(min >stack[i]){
                min = stack[i];
            }
        }
        return min;
    }
}
解答成功:
            执行耗时:53 ms,击败了7.10% 的Java用户
            内存消耗:42.8 MB,击败了11.99% 的Java用户
思路2:使用辅助栈存储当前值和之前的最小值
class MinStack {
    int[] stack = new int[10000];
    int last = -1;
​
    //存储栈中当前值之前的最小值
    int[] tempStack = new int[10000];
​
    public MinStack() {
​
    }
    //在入栈的时候给
    public void push(int val) {
        stack[++last] = val;
        tempStack[last] = val;
​
        if(last >0 && tempStack[last-1] < val){
            tempStack[last] = tempStack[last-1];
        }
​
​
    }
    //因为操作都是在非空栈进行
    public void pop() {
        last--;
    }
    
    public int top() {
        return stack[last];
    }
    
    public int getMin() {
​
        return tempStack[last];
    }
}
解答成功:
            执行耗时:4 ms,击败了98.32% 的Java用户
            内存消耗:44.8 MB,击败了5.01% 的Java用户
思路3:常数级的额外空间思路

思路:栈中存储第i项值和前i-1项最小值的差值 dis = val - min

那么怎么恢复这个val呢?

如果 dis > 0,直接用栈中存储的值加上min

如果dis <= 0 那么这个val在push的时候会被更新成min,说明min就是val。

因为栈中存储的是差值,当min是-2147483648时,dis就会溢出,所以使用long型解决溢出问题。

class MinStack {
    long[] stack = new long[10000];
    int last = -1;
    long dis = 0;
    long min = 0;
    //存储栈中当前值之前的最小值
    //int[] tempStack = new int[10000];
​
    public MinStack() {
​
    }
​
    
    public void push(int val) {
​
        if(last == -1){
            stack[++last] = (long) 0;
            min = (long) val;
        }else{
            dis = (long) (val - min);
​
            stack[++last] = dis;
            //更新最小值
            if(val < min){
                min = (long) val;
            }
        }
​
    }
    //因为操作都是在非空栈进行
    public void pop() {
        dis = stack[last--];
​
        
        //
        if(dis < 0){
            min = min - dis;
        }
​
    }
    
    public int top() {
        dis = stack[last];
        if(stack[last] > 0){
            return (int) (dis + min);
        }else{
            return (int) min;
        }
    }
    
    public int getMin() {
        return (int) min;
    }
}
解答成功:
            执行耗时:4 ms,击败了98.27% 的Java用户
            内存消耗:44.5 MB,击败了5.05% 的Java用户
            
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/737332.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号