最小栈的实现与优化

发布时间:2020-07-18 13:09:19 作者:张涛泽
来源:网络 阅读:318

最小栈

实现一个最小栈,一步一步优化,从额外空间O(N) 到O(1) 。面试官看重代码逻辑。push,pop,top,getMin都是O(1)时间。

1 用一个最小栈来存储最小值

1.1要点:

1.2 复杂度和代码

额外空间消耗O(N),如何优化到O(1).

public class MinStack1 {    private Stack<Integer> data = new Stack<Integer>();    private Stack<Integer> minValue = new Stack<Integer>();    public void push(int x) {
        data.push(x);        if (minValue.isEmpty() || x <= minValue.peek())
            minValue.push(x);
    }    public void pop() {        int value = data.pop();        if (value == minValue.peek())
            minValue.pop();
    }    public int top() {        return data.peek();
    }    public int getMin() {        return minValue.peek();
    }
}

2 优化空间复杂度到O(1)

如何只用一个栈实现最小栈的实现?

2.1 图

入栈顺序:2,1,3,4,-2,0,-2
diff栈的计算 = data - min

出栈的data最小值
diff栈最小值min
22
02
11
-11
31
21
41
31
-2-2
-3-2
0-2
2-2
-2-2
0-2

top : 如何根据diff栈来恢复栈顶top的元素?
push : 如何更新min最小值?
pop : 如何维护min的最小值?

2.2 代码

注意:第一次入栈diff的特殊处理。

public class MinStack3 {    private Stack<Integer> diff = new Stack<Integer>();    private int minValue;    public void push(int x) {        if (diff.isEmpty()) {
            minValue = x;
            diff.push(0);
        } else {            int compare = x - minValue;
            diff.push(compare);
            minValue = compare < 0 ? x : minValue;
        }
    }    public void pop() {        int top = diff.peek();
        minValue = top < 0 ? (minValue - top) : minValue;
        diff.pop();
    }    public int top() {        int top = diff.peek();        return top > 0 ? top + minValue : minValue;
    }    public int getMin() {        return minValue;
    }
}

新航道雅思

推荐阅读:
  1. 实现一个栈,并且实现一个min函数用来找当前栈中最小的元素
  2. 【算法】最小栈的实现(getMin)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

private 面试官 public

上一篇:Cocos2D-Android-1之源码详解:23.TileMapTest1

下一篇:解决Windows7上安装centos7双系统,Windows启动项消失的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》