LeetCode: Min Stack 最小栈 Java

题目描述:

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

push(x) -- Push element x onto stack.

pop() -- Removes the element on top of the stack.

top() -- Get the top element.

getMin() -- Retrieve the minimum element in the stack.

设计一个最小栈,支持入栈,出栈,获取栈顶元素,获取栈最小值,要求时间复杂度0(1).

 

Stack(栈)是First in-Last out的数据结构。如果不考虑时间复杂度,实现题目的要求都比较简单,现在限定了不超过常量时间O(1),
就不能用简单的排序过滤实现了。

另外,栈顶(top)指的是允许操作数据的一端,要与堆栈中高低地址不同的栈顶和栈底区别开来,以前我经常搞混。

public class MinStack {

    //声明数据栈
    private Stack<Integer> elementsStack=new Stack<Integer>();
    //声明辅助栈
    private Stack<Integer> supportStack=new Stack<Integer>();
    /**
     * 考虑到时间复杂度的需求,添加一个辅助栈,
     * 每次入栈时将元素分别存入数据栈和辅助栈,
     * 辅助栈中的数据始终保持最小值在栈顶,需要获取最小值时,直接Peek()辅助栈即可。
     */
    public static void main(String[] args){
        MinStack minStack=new MinStack();
//以下测试用例
        minStack.push(0);
        minStack.push(1);
        minStack.push(0);
        System.out.print(minStack.getMin());
        minStack.pop();
        System.out.print(minStack.getMin());
    }
    public void push(int x) {
        //始终保持辅助栈顶是最小元素
        if(supportStack.empty() || x <= supportStack.peek()){
            supportStack.push(x);
        }
        elementsStack.push(x);
    }

    public void pop() {
        //更新辅助栈
        if(elementsStack.peek().equals(supportStack.peek())){
            supportStack.pop();
        }
        elementsStack.pop();
    }

    public int top() {
        return elementsStack.peek();
    }

    public int getMin() {
        //辅助栈
        return supportStack.peek();
    }

}

 提交,可以AC.

时间: 2024-09-23 06:30:41

LeetCode: Min Stack 最小栈 Java的相关文章

[LeetCode] Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) – Push element x onto stack. pop() – Removes the element on top of the stack. top() – Get the top element. getMin() – Retrieve the minimum eleme

关于java stack压栈出错

问题描述 关于java stack压栈出错 public class ReverseString { Stack word; Stack sentence; public void reverse(String sentence){ for(int i=0; i<sentence.length(); i++){ char n =sentence.charAt(i); if(n!=' '){ word.push(n); }else{ while(!word.empty()){ this.sente

leetcode 155 Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. • push(x) – Push element x onto stack. • pop() – Removes the element on top of the stack. • top() – Get the top element. • getMin() – Retrieve the minim

【25】实现一个含有min函数的栈的通用模板

题目:设计一个栈类型,使得在该栈类型中有一个函数min可以得到栈的最小元素,要求这个栈的push.pop.min都是O(1). 分析: 1. 栈的性质是先进后出,因此一般情况下栈的push.pop的时间是O(1),但是要求栈的min必须要枚举整个栈,时间复杂度为O(n) 2. 题目要求设计一个栈在O(1)的时间内找到min,我们要想到一个方法来满足,先看一个例子 3. 从下面的表中我们可以很清楚的看到,我么需要维护一个保存min的栈,并且这个栈和我们的数据栈是一起变化的,因此我们可以利用两个栈来

剑指offer:包含min函数的栈

剑指offer上的第21题,之前在Cracking the Coding interview上做过,思路参考这里,这次写了测试函数,在九度OJ上测试通过. 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数. 接下来有n行,每行开始有一个字母Ci. Ci='s'时,接下有一个数字k,代表将k压入栈. Ci

[程序员面试题精选100题]2.设计包含min函数的栈

[题目] 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). [分析] 是去年google的一道面试题. 我看到这道题目时,第一反应就是每次push一个新元素时,将栈里所有逆序元素排序.这样栈顶元素将是最小元素.但由于不能保证最后push进栈的元素最先出栈,这种思路设计的数据结构已经不是一个栈了. 在栈里添加一个成员变量存放最小元素(或最小元素的位置).每次push一个新元素进栈的时候,如果该元素比当前的最小元素还要小,则

Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. push(x) -- Push element x onto stack. pop() -- Removes the element on top of the stack. top() -- Get the top element. getMin() -- Retrieve the minimum e

[LeetCode] Smallest Range 最小的范围

You have k lists of sorted integers in ascending order. Find the smallest range that includes at least one number from each of the k lists. We define the range [a,b] is smaller than range [c,d] if b-a < d-c or a < c if b-a == d-c. Example 1: Input:[

小览call stack(调用栈) (二)——调用约定

在上一篇博客中小览call stack(调用栈) (一)中,我展示了如何在windbg中 观察调用栈的相关信息:函数的返回地址,参数,返回值.这些信息都按照一定 的规则存储在固定的地方.这个规则就是调用约定(calling convention). 调用约定在计算机界不是什么新鲜的概念,已经有许多相关的文献给予详细 的介绍.比较全面的介绍可以参见wikipedia上的相关页面.然而,如果你和我 一样,在第一次接触调用约定的时候,觉得这个概念是个高深神秘的冬冬,那么 就请跟随我一起,在这篇博客中看