剑指offer: 包含min函数的栈

题目来源:牛客网


题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。


思路分析

首先列举一个压栈数组,观察其特点

Stack top
stack1 top 66
stack1 top 60 50
stack1 top 60 50 50
stack1 top 60 50 50 80
stack1 top 60 50 50 80 20
stack1 top 60 50 50 80 20 0

根据上面分析来分析每次压栈的时候最小值的变化

压栈次数 最小值
1 66
2 50
3 50
4 50
5 20
6 0

可以看出来只有在当前压入的数值小于或者等于该栈中的当前最小值时,才需要更改最小值。


再观察出栈的情况

Stack top
stack1 top 60 50 50 80 20
stack1 top 60 50 50 80
stack1 top 60 50 50
stack1 top 60 50
stack1 top 66
stack1 top

根据上面分析来分析每次出栈的时候最小值的变化

出栈次数 最小值
1 20
2 50
3 50
4 50
5 66
6

可以看出来只有在当前出栈的数值等于该栈中的当前最小值时,才需要更改最小值。


总结

对于本题构造两个栈(stack和min),stack用于存放压入的数据,min用于存放每一段的最小值。
根据分析可以知道:
当向stack压入元素时
如果stack内没有元素(空栈)时,则直接压入到min中
否则,判断压入的元素跟min栈顶元素的关系。
即如果该元素小于等于min的栈顶元素,则压入min中。反之,则不入栈。
当stack弹出元素时
如果弹出元素的值等于min的当前栈顶元素,则弹出min的当前栈顶元素


代码实现

import java.util.Stack;

public class Solution {
    private Stack<Integer> stack = new Stack<>();
    private Stack<Integer> min = new Stack<>();
    
    public void push(int node) {
        if (this.stack.empty() || node <= min.peek()) {
            min.push(node);
        }
        this.stack.push(node);
    }
    
    public void pop() {
        if (this.stack.pop() == min.peek()) {
            min.pop();
        }
    }
    
    public int top() {
        return this.stack.peek();
    }
    
    public int min() {
        return this.min.peek();
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容