剑指offer(22):包含min函数的栈

来源:互联网 发布:财务会计软件目的 编辑:程序博客网 时间:2024/04/30 10:06

题目描述

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

分析

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

推荐解法:使用一个辅助栈mins存放每一次入栈操作的最小元素,min()函数直接从辅助栈mins的栈顶进行弹出操作,在O(1)时间内完成,以空间换时间。当最小元素从原数据栈data内被弹出时,同时弹出辅助栈mins内的栈顶元素,则mins辅助栈的新的栈顶元素就是下一个最小值。

牛客AC代码:

/** * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的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;    }}

参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社

0 0
原创粉丝点击