155. 最小栈(中等系列)

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

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

示例 1:

输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

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

提示:

-231 <= val <= 231 - 1
pop、top 和 getMin 操作总是在 非空栈 上调用
push, pop, top, and getMin最多被调用 3 * 104 次

第一种:栈

class MinStack {
    // 数据栈,用于存储元素
    public Stack<Integer> data;
    // 最小值栈,用于存储当前栈内的最小值
    public Stack<Integer> min;
    
    // 构造函数,初始化两个栈
    public MinStack() {
        data = new Stack<Integer>();
        min = new Stack<Integer>();
    }
    
    // 元素入栈操作
    public void push(int val) {
        data.push(val); // 将元素压入数据栈

        // 如果最小值栈为空,或者新元素小于当前最小值栈顶元素
        if (min.empty() || val < min.peek()) {
            min.push(val); // 将新元素压入最小值栈
        } else {
            min.push(min.peek()); // 否则将当前最小值栈顶元素再次压入最小值栈,保持与数据栈元素个数一致
        }
    }
    
    // 元素出栈操作
    public void pop() {
        data.pop(); // 从数据栈中弹出一个元素
        min.pop();  // 同时从最小值栈中弹出一个元素,保持两个栈的同步
    }
    
    // 获取栈顶元素
    public int top() {
       return data.peek(); // 返回数据栈的栈顶元素,不出栈
    }
    
    // 获取当前栈内的最小值
    public int getMin() {
      return min.peek(); // 返回最小值栈的栈顶元素,即当前栈内的最小值
    }
}

第二种:数组自定义栈

class MinStack {
    public final int MAXN = 8001; // 定义最大容量
    int[] data; // 存储元素的数组
    int[] min; // 存储当前最小元素的数组
    int size; // 栈的大小
  
    public MinStack() {
        data = new int[MAXN]; // 初始化data数组
        min = new int[MAXN]; // 初始化min数组
        size = 0; // 初始化栈大小
    }
    
    // 入栈操作
    public void push(int val) {
        data[size] = val; // 将元素放入data数组
        if (size == 0 || val < min[size - 1]) {
            min[size] = val; // 更新min数组,如果val比前一个最小值小
        } else {
            min[size] = min[size - 1]; // 如果val不是最小值,保持原最小值
        }
        size++; // 增加栈大小
    }
    
    // 出栈操作
    public void pop() {
        size--; // 减少栈大小,相当于出栈
    }
    
    // 获取栈顶元素
    public int top() {
        return data[size - 1]; // 返回栈顶元素
    }
    
    // 获取栈中的最小元素
    public int getMin() {
        return min[size - 1]; // 返回当前最小元素
    }
}

https://leetcode.cn/problems/min-stack/description/

参考左程云老师算法系列

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值