Leetcode题解——30. 包含min函数的栈(辅助栈思想)

2023-11-15

 题目地址:剑指 Offer 30. 包含min函数的栈 - 力扣(LeetCode)

目录

一.算法思想

二.代码实现

三.拓展思考


 

 

 首先说结论,这道题虽然难度不大,但是算法思想很重要,是辅助栈应用的生动实例。

所以,这里小编不再重点将代码,而是讲思想。

一.算法思想

本题使用了辅助栈的思想,小编私以为叫同步栈更加合适。

首先一个栈用来正常存放,记作st。

再设一个栈用来存放最小值,记作st_min。

这里的难点就是在st出栈后,假如出栈元素就是最小值,那么怎么回溯到上一个最小值。

本题的最核心的思想就是:

当st入栈出栈时,st_min同时入栈出栈。即同步栈。

但是st_min入栈的值始终是此时的最小值。

即,如果此时st入栈值小于st_min,那st_min入该值。

但如果st入栈值大,那st_min继续入自己的栈顶元素,即最小值。

以图举例:

此时st中入了三个元素,但后两个元素都比st_min的栈顶元素1大,所以st_min依旧入自己栈顶元素。 

但当-3入栈st后,-3小于1,所以st_min开始入栈-3。

出栈时就是正常出栈,当st中-2出栈,st_min也同步出栈-3。

这样就可以利用同步栈的特性,完美的解决了当出栈值就是最小值时,回溯到上一个最小值的问题。这也就是本题最核心的算法。 

二.代码实现

class MinStack {
     stack<int> st;
     stack<int> st_min;
public:
    MinStack() 
    {
        st_min.push(INT_MAX);//首先装入一个最大值,确保第一个入栈元素能入st_min
    }
    
    void push(int x) {
        st.push(x);
        if(x < st_min.top())
            st_min.push(x);
        else st_min.push(st_min.top());
    }
    
    void pop() {
       st.pop();
       st_min.pop();
    }
    
    int top() {
        return st.top();
    }
    
    int min() {
        return st_min.top();
    }
};

三.拓展思考

小编感觉遇到栈和队列的问题,不妨多思考思考多个栈和多个队列组合、混合组合的方式。

这往往能用来解决问题。 

比如最经典的用栈实现队列 Loading Question... - 力扣(LeetCode)

用队列实现栈225. 用队列实现栈 - 力扣(LeetCode)

这些都是非常经典的算法思想启发题。 

在小编看来,解题最重要的不在难度,而是对于思想的启发。人是在创新中前进而不是在固步自封的强化中前进。

 

 拼命干活无法取代理解。—— H William


如有错误,敬请斧正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode题解——30. 包含min函数的栈(辅助栈思想) 的相关文章

随机推荐

  • 论文阅读: GeoNet: Unsupervised Learning of Dense Depth, Optical Flow and Camera Pose(CVPR2018)

    CVPR2018 GeoNet Unsupervised Learning of Dense Depth Optical Flow and Camera Pose 提出了一个联合估计深度 光流和pose的网络 这是在left right c
  • Javascript设计模式-04-工厂模式

    Javascript设计模式 04 工厂模式 简单工厂 抽象工厂 简介 工厂模式定义一个用于创建对象的接口 这个接口由子类决定实例化哪一个类 该模式使一个类的实例化延迟到了子类 而子类可以重写接口方法以便创建的时候指定自己的对象类型 个人理
  • webview跳转第三方APP

    hello 又是我鑫鑫 前言 这吃给大家带来的博客是关于webview跳转第三方APP的 相信这个问题也为难过各位 那么话不多说 我直接上代码 MainActivity java 这里的活动名我没有改 使用的话 将所有的Contact Cu
  • C规范编辑笔记(十三)

    往期文章 C规范编辑笔记 一 C规范编辑笔记 二 C规范编辑笔记 三 C规范编辑笔记 四 C规范编辑笔记 五 C规范编辑笔记 六 C规范编辑笔记 七 C规范编辑笔记 八 C规范编辑笔记 九 C规则编辑笔记 十 C规范编辑笔记 十一 C规范编
  • 线性表技巧之Note001-链表的最后一个节点

    找到单链表的尾节点 通常我们遍历单链表的代码如下 list 指向单链表的头节点 因此 list gt next 指向链表的第一个节点 LNode node list gt next while node NULL node node gt
  • Qt项目环境构建

    工欲善其事必先利其器 使用Qt来进行开发 得先配置好一个合适的环境 下面是我关于Qt项目环境构建的一些小结 Qt的项目构建主要依赖 pro文件 和 pri文件 include包含文件 提供pro的复用性高的东西给多个项目包含 所以新建一个Q
  • mysql query 查询_mysql提供了explain query_sql进行查询分析

    mysql提供了explain query sql进行查询分析 下边是一些参数说明 ID Query Optimizer 所选定的执行计划中查询的序列号 Select type 所使用的查询类型 主要有以下这几种查询类型 DEPENDENT
  • 面试时这样介绍算法,想不高薪都难,排序算法(冒泡排序)

    算法背景 冒泡排序是一种简单的排序算法 它重复地遍历要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 遍历数列的工作是重复地进行直到没有再需要交换 也就是该数列已经排序完成 这个算法的名字由来是因为越大的元素会经由交换慢慢
  • OpenCV-Python自适应直方图均衡类CLAHE及方法详解

    一 引言 对比度受限的自适应直方图均衡在OpenCV中是通过类CLAHE来提供实现的 老猿没研究过C 中的应用 但OpenCV Python中应用时与普通的Python类构建对象的机制有所不同 老猿做了相关测试 在此简单介绍一下 二 CLA
  • 为什么 API 治理需要内部倡导

    API 治理旨在帮助人们通过 API 实现最大价值 但是 只有了解 API 是什么以及 API 的重要性 并且认识到 API 治理是在帮助他们而不是监管他们 才能实现这一目标 这就是为什么在任何 API 治理举措中都必须包括内部 API 倡
  • 修改mesh的clolors属性

    using UnityEngine using System Collections public class ExampleClass MonoBehaviour void Start Mesh mesh GetComponent
  • Android开发笔记 自定义AlertDialog

    近期有个需求需要在自定义AlertDialog上添加一个输入框 并拿到输入的信息发送给后台 开发中有遇到些之前没有接触过的问题 所以记录下来 如果需要自定义的话 AlertDialog mDialog new AlertDialog Bui
  • linux中安装gitlab,修改密码

    安装分为远程下载安装和本地安装 远程的总提示我阿里云版本不对 所以我使用的是本地安装 1 清华的gitlab安装包下载地址 https mirrors tuna tsinghua edu cn gitlab ce yum el7 C M O
  • python爬取汽车之家_python爬取 汽车之家(汽车授权经销商)

    一 爬虫的目标 打开汽车之家的链接 https www autohome com cn beijing 出现如下页面 我们的目标是 点击找车 然后出现如下图 我们要把图中的信息抓取到 二 实现过程 我们选择 宝马5系 然后点击找车 注意宝马
  • 华为二面被问Redis分布式锁,您是不是有点小瞧我了?

    之前写了两篇有关线程安全的文章 你管这叫线程安全 NET八股文 线程同步技术解读 分布式锁是 线程同步 的延续 最近首度应用 分布式锁 现在想想 分布式锁不是孤立的技能点 这其实就是跨主机的线程同步 进程内 跨进程 跨主机 Lock Mon
  • 蓝桥杯 Day11 java组 DFS

    所谓暴力法 是把所有可能的情况都罗列出来 然后逐一检查 从中找到答案 暴力法往往是 低效 的代名词 不过相对其他 高效 算法 暴力法不仅简单且编码量一般都更短更好写 所以当拿到一个题目后 首先想想如何用暴力法解决 如果暴力法的代码能满足题目
  • Angular中页面传参获取参数

    今天使用html传参数 始终获取不到参数值 研究了半天 终于解决 以下是angular获取页面传参参数方法 在angular中有一项服务为 location 使用这项服务可以获取页面参数 location的方法不止这一个 还可以获取很多 在
  • Leetcode之循环轮转矩阵

    题目 给你一个大小为 m x n 的整数矩阵 grid 其中 m 和 n 都是 偶数 另给你一个整数 k 矩阵由若干层组成 如下图所示 每种颜色代表一层 矩阵的循环轮转是通过分别循环轮转矩阵中的每一层完成的 在对某一层进行一次循环旋转操作时
  • “1448万,一条命”:在生命面前,金钱显得太刺眼

    1 前段时间 美国上市了一种治疗小儿脊髓性肌肉萎缩的药 引起了非常激烈的讨论 为什么会有这么大的争议呢 因为这种药特别贵 标价210万美元 人民币约1448万元 仅仅一支药 就相当于北京三环一套房 小儿脊髓性肌肉萎缩这个病到底有多恐怖呢 得
  • Leetcode题解——30. 包含min函数的栈(辅助栈思想)

    题目地址 剑指 Offer 30 包含min函数的栈 力扣 LeetCode 目录 一 算法思想 二 代码实现 三 拓展思考 首先说结论 这道题虽然难度不大 但是算法思想很重要 是辅助栈应用的生动实例 所以 这里小编不再重点将代码 而是讲思