LeetCode 155. 最小栈

题目描述

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

实现 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.

解法

1.辅助栈

解题思路

直接建立一个栈,对于push、pop、top这三个操作都可以在O(1)的时间内完成,唯独getmin无法实现,这是这道题的考察点。我们采用空间换时间的方式,额外使用一个辅助栈来保存栈中的最小元素。每次进栈,需要判断该元素是不是最小元素,把最小元素放到s_min栈的栈顶(注意不能对空栈进行top操作),出栈时,需要把两个栈顶元素同时出栈,以保证信息同步。

cpp 复制代码
class MinStack {
private:
    stack<int> s;
    stack<int> s_min;
public:
    MinStack() {
        
    }
    
    void push(int val) {
        s.push(val);
        int temp = val;
        if(!s_min.empty()){
            temp = min(temp,s_min.top());
        }
        s_min.push(temp);
    }
    
    void pop() {
        s.pop();
        s_min.pop();
    }
    
    int top() {
        return s.top();
    }
    
    int getMin() {
        return s_min.top();
    }
};

时间复杂度O(1),空间复杂度O(N)

相关推荐
DanyHope5 分钟前
LeetCode 两数之和:从 O (n²) 到 O (n),空间换时间的经典实践
前端·javascript·算法·leetcode·职场和发展
free-elcmacom12 分钟前
机器学习高阶教程<6>推荐系统高阶修炼手册:混排、多任务与在线学习,解锁精准推荐新境界
人工智能·python·学习·算法·机器学习·机器人
断剑zou天涯12 分钟前
【算法笔记】AC自动机
java·笔记·算法
IT猿手16 分钟前
基于粒子群算法与动态窗口混合的无人机三维动态避障路径规划研究,MATLAB代码
算法·matlab·无人机·多目标优化算法·多目标算法
民乐团扒谱机17 分钟前
【微实验】仿AU音频编辑器开发实践:从零构建音频可视化工具
算法·c#·仿真·audio·fft·频谱
DanyHope19 分钟前
LeetCode 283. 移动零:双指针双解法(原地交换 + 覆盖补零)全解析
数据结构·算法·leetcode
bulingg35 分钟前
集成模型:gbdt,xgboost,lightgbm,catboost
人工智能·算法·机器学习
d111111111d36 分钟前
编码器测速详情解释:PID闭环控制
笔记·stm32·单片机·嵌入式硬件·学习·算法
麒qiqi42 分钟前
【Linux 进程间通信】信号通信与共享内存核心解析
java·linux·算法
肆悟先生1 小时前
3.15 引用类型
c++·算法