腾讯50题-155最小栈

题目描述:

设计一个支持push,pop,top操作,并能在常数时间内检索到最小元素的栈。

  • push(x) – 将元素 x 推入栈中。
  • pop() – 删除栈顶的元素。
  • top() – 获取栈顶元素。
  • getMin() – 检索栈中的最小元素。

示例:

  • MinStack minStack = new MinStack();
  • minStack.push(-2);
  • minStack.push(0);
  • minStack.push(-3);
  • minStack.getMin(); --> 返回 -3.
  • minStack.pop();
  • minStack.top(); --> 返回 0.
  • minStack.getMin(); --> 返回 -2.
思路:

首先,我们需要明确,一般情况下,栈的特点和基本操作。

  • 栈的特点是先入后出,用于倒序特别方便,比如,对链表进行逆序操作;
  • 在java中,栈的导入是import java.util.Stack;
  • 在java中,栈的实例化(以整形为例) Stack<Integer> stack = new Stack<Integer>();
  • 在java中,栈的基本操作如下:
    • push—插入元素;
    • pop()–取出栈顶的元素
    • peek()–查看栈顶元素,并不取出
    • isEmpty()—查看栈是否是空的

接着,在本题中,需要完成的功能有

  • push–含义和原来的一样,暂时不需要进行特别处理
  • pop—含义和原来的一样,暂时不需要进行特别处理
  • top—含义和原来的peek一样,暂时不需要进行特别处理
  • getMin—新的功能,需要考虑怎么处理,最简单的思路,再建立一个栈,保存最小的元素,如果要返回最小元素,那么直接从辅助栈中返回最小元素。

那么,可以考虑,在之前的三个功能中,只要操作对象不是最小元素,那么就不需要进行更改。考虑重新对所有操作进行分析

  • push–如果第一次添加元素(数据栈和辅助栈都是空),那么这个元素也是目前的最小值,直接同时添加到辅助栈和数据栈,如果不是第一次添加元素(符篆栈里面存放着最小值),那么对于数据栈,就直接插入元素,对于辅助栈,要判断待添加的元素和已经存放的最小值谁最小,如果原来的最小,那么就不需要什么操作,否则,将待添加的元素压入栈
  • pop—对于数据栈,是一样的,对于辅助栈,如果数据栈弹出的元素和辅助栈栈顶的元素是一样的,那么辅助栈也弹出,否则,不对辅助栈做操作
  • peek–和辅助栈没关系
  • getMin()—返回辅助栈的栈顶元素;
代码:
import java.util.Stack;
class MinStack {
    // 数据栈
    private Stack<Integer> data;
    // 辅助栈
    private Stack<Integer> helper;

    /** initialize your data structure here. */
    public MinStack() {
        data = new Stack<Integer>();
        helper = new Stack<Integer>();

        
    }
    
    public void push(int x) {
        if(data.isEmpty()){
            data.push(x);
            helper.push(x);
        }else{
            data.push(x);
            int min_val = helper.peek();
            if (x<min_val){
                helper.push(x);
            }  
        }
        
    }
    
    public void pop() {
        int temp = data.pop();
        if(temp==helper.peek()){
            helper.pop();
        }
        
    } 
    public int top() {
        return data.peek();
        
    }
    
    public int getMin() {
        return helper.peek();
    }
}

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack obj = new MinStack();
 * obj.push(x);
 * obj.pop();
 * int param_3 = obj.top();
 * int param_4 = obj.getMin();
 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值