剑指offer 面试题19 包含min函数的栈

题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min、push及pop的时间复杂度都是o(1)

问题分析:

最直接的思路:每次有一个元素进栈都进行一次排序,使最小的元素始终位于栈顶,可以在O(1)时间内找到最小元素。但是该方法不能保证“先进后出”的栈的特性。

推荐解法:使用一个辅助栈mins存放每一次入栈操作的最小元素,min()函数直接从辅助栈mins的栈顶进行弹出操作,在O(1)

时间内完成,以空间换时间。当最小元素从原数据栈data内被弹出时,同时弹出辅助栈mins内的栈顶元素,则mins辅助栈的新的栈顶元素就是下一个最小值。

代码如下:

/**
 * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
 * 要求在该栈中,调用min push pop的时间复杂度都是O(1)
 */

import java.util.Stack;

public class MinStack {

    Stack<Integer> data = new Stack<Integer>(); // 数据栈
    Stack<Integer> mins = new Stack<Integer>(); // 辅助栈,存放最小值
    Integer tmpMin = null;

    // 数据进栈,最小值进栈
    public void push(int node) {
        if(tmpMin == null) {
            tmpMin = node;
            data.push(node);
            mins.push(node);
        } else {
            if(node <= tmpMin) {
                tmpMin = node;
                mins.push(node);
            }
            data.push(node);
        }
    }

    // 弹出栈顶元素
    public void pop() {
        int num1 = data.pop();
        int num2 = mins.pop();
        if(num1 != num2)
            mins.push(num2);
    }

    // 查看栈顶元素
    public int top() {
        int num = data.pop();
        data.push(num);
        return num;
    }

    // 查看当前最小元素
    public int min() {
        int num = mins.pop();
        mins.push(num);
        return num;
    }
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值