Leetcode栈题目笔记1 最小栈

本文介绍了如何设计一个栈结构,同时在常数时间内获取栈中的最小元素。提供了两种实现方式,一种是使用辅助栈,每次入栈时比较并更新最小值;另一种是使用一个额外的变量记录最小值,入栈时根据元素与当前最小值的关系进行操作。这两种方法都能确保在常数时间内获取最小值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最小栈包含min函数的栈:设计支持在常数时间内检索到最小元素的栈

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

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

示例:

输入:
["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.

该类题目大多可以使用辅助的数据结构来完成。

首先,使用辅助栈:分别定义两个 stack<int>:需要实现的栈结构 st 以及辅助栈 assistSt。对于常规的栈 st,有元素入栈时直接入栈、有元素出栈时直接出栈,需要读取其栈顶元素时直接返回其栈顶元素即可,即实现栈的常规功能;而检索栈内最小值的操作由辅助栈 assistSt 来完成。

assistSt 首先入栈 INT_MAX 以方便后续比较。assistSt 栈顶元素永远存储 st 栈内的最小值。每次有元素 x 入栈时,先比较 assistSt.top() 与 x 的大小关系:若 x 小于 assistSt 栈顶元素,说明当前需要入栈的数值 x 比当前栈内的数值都小,assistSt 入栈 x;若 x 大于 assistSt 栈顶元素,说明当前需要入栈的数值 x 比当前栈内的最小值更大,assistSt 再次入栈之前栈内的最小值。因此,assistSt 栈顶元素总是存放 st 当前栈内的最小值,在相应 min 函数中直接输出 assistSt.top() 即可。

class MinStack {
    stack<int> st;
    stack<int> assistSt;
public:
    /** initialize your data structure here. */
    MinStack() {
        assistSt.push(INT_MAX);
    }
    
    void push(int x) {
        st.push(x);
        assistSt.push(::min(assistSt.top(), x));
    }
    
    void pop() {
        st.pop();
        assistSt.pop();
    }
    
    int top() {
        return st.top();
    }
    
    int min() {
        return assistSt.top();
    }
};

其次,不使用辅助栈:定义需要实现的常规栈结构 st, 以及一个辅助整型数字 min_value,用于存放当前栈内最小值。有元素 x 需要入栈时,判断 x 与 min_value 的大小:若 x <= min_value,说明需要入栈的数值比栈内元素都小,那么首先将原来的 min_value 入栈,用于记录最小值更新之前的最小值,再更新 min_value,最后入栈 x; 若 x > min_value,则直接入栈 x 即可。

st 出栈时,如果栈顶元素等于 min_value,说明 栈顶元素 st.top() 为 x < min_value 情况下入栈的元素,那么其下一个元素为记录的之前的 min_value记录,则首先出栈栈顶元素,然后将 min_value 退回到之前的 min_value,再将多存储的 min_value 记录出栈。

class MinStack {
    stack<int> st;
    int min_value = INT_MAX;
public:
    /** initialize your data structure here. */
    MinStack() {
        
    }
    
    void push(int x) {
        if(x <= min_value){
            st.push(min_value);
            min_value = x;
        }
        st.push(x);
    }
    
    void pop() {
        if(st.top() == min_value){
            st.pop();
            min_value = st.top();
        }
        st.pop();
    }
    
    int top() {
        return st.top();
    }
    
    int min() {
        return min_value;
    }
};

### 安装和配置 ORB-SLAM2 的准备工作 为了在 Ubuntu 22.04 上成功安装和配置 ORB-SLAM2,需要先完成一系列前置条件的设置。这包括更新软件包列表并更换国内镜像源以加速下载速度。 #### 更换国内镜像源 由于官方源可能较慢,在新安装的系统中建议替换为阿里云或其他快速稳定的国内镜像源[^1]: ```bash sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i &#39;s/https:\/\/archive\.ubuntu\.com\/ubuntu\//http:\/\/mirrors.aliyun.com\/ubuntu\-security/g&#39; /etc/apt/sources.list ``` 随后执行更新操作来同步最新的软件包信息: ```bash sudo apt update && sudo apt upgrade -y ``` ### 安装必要的依赖项 对于 ORB-SLAM2 来说,有几个重要的依赖库是必不可少的。这些可以通过 APT 包管理器轻松获取。需要注意的是,部分依赖项名称可能会随着版本迭代而有所变化;因此这里提供适用于 Ubuntu 22.04 版本的具体命令[^4]: ```bash sudo apt-get install build-essential cmake git pkg-config \ libopencv-dev libeigen3-dev libsuitesparse-dev qtbase5-dev-tools \ libusb-1.0-0-dev python-is-python3 python3-pip python3-opencv \ ros-noetic-cv-bridge ros-noetic-image-transport-plugins ``` 上述指令不仅包含了编译工具链以及计算机视觉所需的 OpenCV 和 Eigen 库,还加入了 ROS Noetic 中用于图像处理的相关插件支持。 ### 下载与构建 ORB-SLAM2 接下来是从 GitHub 获取最新版 ORB-SLAM2 并按照说明文档中的指导进行本地化部署。考虑到 Qt 工具集的重要性,推荐采用预编译二进制文件的方式简化安装流程[^3]。 #### 安装 Qt 开发套件 (可选) 如果项目涉及图形界面开发,则需额外准备 Qt 环境。可以考虑通过如下方式直接运行安装程序自动完成整个过程(注意调整路径至实际存放位置): ```bash chmod +x ~/Downloads/qt-opensource-linux-x64-*.run sudo ~/Downloads/qt-opensource-linux-x64-*.run ``` #### 编译 ORB-SLAM2 源码 克隆仓库到工作目录后,进入 `Examples` 文件夹内选择感兴趣的应用场景作为入口点开始调试。以下是针对单目相机的例子: ```bash git clone https://github.com/raulmur/ORB_SLAM2.git cd ORB_SLAM2 mkdir build && cd build cmake .. make -j$(nproc) ``` 最后一步利用多核处理器加快编译效率,确保顺利完成所有目标文件链接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值