算法练习(五):包含 min 函数的栈

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

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.

  

解题思路:

标准栈提供了push、top、pop的函数,可以做到时间复杂度是O(1),但是无法支持min函数时间复杂度是O(1);所以该算法核心是要保证min函数时间复杂度是O(1),使用一个额外栈保存最小值,并每次push与pop保证数据同步。

package Algriothm;

import java.util.Stack;

public class MinStack {

    public static void main(String[] args) {

        MinStack minStack = new MinStack();
        minStack.push(-2);
        minStack.push(0);
        minStack.push(-3);
        System.out.println(minStack.min());
        minStack.pop();
        System.out.println(minStack.top());
        System.out.println(minStack.min());

    }

    Stack<Integer> A = null;
    Stack<Integer> B = null;

    /**
     * initialize your data structure here.
     */
    public MinStack() {
        A = new Stack<>();
        B = new Stack<>();
    }


    public void push(int x) {
        A.add(x);
     // 空时,任何元素都是最小值。非空时,仅保存比当前元素小的数 if (B.empty() || B.peek() >= x) B.add(x); } public void pop() {
     // 如果是最小值弹出,则A、B都需要进行弹出操作 if (A.pop().equals(B.peek())) B.pop(); } public int top() { return A.peek(); } public int min() { return B.peek(); } }

  

posted on 2021-08-23 19:58  yssd  阅读(48)  评论(0)    收藏  举报

导航