Leetcode-每日一题【剑指 Offer 30. 包含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.

提示:

  1. 各函数的调用总次数不超过 20000 次

解题思路

1.题目要求我们实现一个能够得到栈的最小元素的 min 函数,且调用 min、push 及 pop 的时间复杂度都是 O(1)。我们需要用到两个栈去解决这个问题。

2.举个例子:

下面我们开始进行入栈操作,在入栈第一个元素时Stack1直接入栈,而当Stack2为空时我们也将元素直接入栈。

 在入栈第二个元素时Stack1依旧直接入栈,这时我们发现要入栈的元素大于Stack2的栈顶元素,所以我们不对Stack2进行入栈操作,

以下入栈操作的思路相同,Stack1正常入栈,Stack2只有在空的时候或者栈顶元素大于被入栈元素时才进行入栈。

 此时入栈操作全部执行结束,我们来看看出栈操作,

在出栈操作时,我们需要先判断Stack1是否为空,要保证我们有元素可以出栈,当Stack1不为空时,Stack2一定也不为空。然后我们将Stack1的栈顶元素与Stack2的栈顶元素进行比较,若两元素不同,则只将Stack1进行出栈,否则就要将Stack1和Stack2同时出栈。

出栈操作执行结束。

3,还有最后两个方法,pop()求栈顶元素时我们只需要返回Stack1的栈顶即可,min()求栈中最小元素时我们只需要返回Stack2的栈顶元素即可。 

代码实现

class MinStack {
    Stack<Integer> Stack1;
    Stack<Integer> Stack2;


    /** initialize your data structure here. */
    public MinStack() {
        Stack1 = new Stack();
        Stack2 = new Stack();
    }
    
    public void push(int x) {
        Stack1.push(x);
        if(Stack2.isEmpty() || x <= Stack2.peek() ){
            Stack2.push(x);
        }
    }
    
    public void pop() {
        if(!Stack1.isEmpty()){
            //数值大于 127,比较的就是一个对象
            if(Stack1.peek().intValue() == Stack2.peek().intValue()){
                Stack2.pop();
            }
            Stack1.pop();
        }
    }
    
    public int top() {
        return Stack1.peek();
    }
    
    public int min() {
        return Stack2.peek();
    }
}

测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值