【LeetCode刷题之路】leetcode155.最小栈

news/2025/2/26 0:02:50

在这里插入图片描述

LeetCode刷题记录
  • 🌐 我的博客主页:iiiiiankor
  • 🎯 如果你觉得我的内容对你有帮助,不妨点个赞👍、留个评论✍,或者收藏⭐,让我们一起进步!
  • 📝 专栏系列:LeetCode 刷题日志
  • 🌱 文章内容来自我的学习与实践经验,如果你有任何想法或问题,欢迎随时在评论区交流讨论。让我们一起探索更多的可能!🚀

LeetCode 155最小栈

解法1:

为实现这些操作,我们可以使用两个栈:

主栈(stack):用于存储所有的元素。
辅助栈(min_stack):用于存储当前栈中的最小元素。

push(x):
将元素 x 推入主栈 stack。
如果 min_stack 为空,或 x 小于等于 min_stack 的栈顶元素,则将 x 也推入 min_stack。
pop():
从主栈 stack 中弹出栈顶元素。
如果弹出的元素等于 min_stack 的栈顶元素,则也从 min_stack 中弹出栈顶元素。
top():
返回主栈 stack 的栈顶元素。
getMin():
返回辅助栈 min_stack 的栈顶元素,即当前栈中的最小元素。

图解:
在这里插入图片描述
在这里插入图片描述
代码:

class MinStack {
public:
    MinStack() {

    }
    
    void push(int val) {
        st.push(val);
        if(minval.empty() || val <= minval.top()){
            minval.push(val);
        }
    }
    
    void pop() {
        //如果top大于此时的最小值,直接pop
        //如果小于等于,那么minval也要pop
        if(st.top() > minval.top())
        {
            st.pop();
        }
        else
        {
            st.pop();
            minval.pop();
        }
    }
    
    int top() {
        return st.top();
    }
    
    int getMin() {
        return minval.top();
    }
private:
    stack<int> st;
    stack<int> minval;     //辅助栈
};

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

引用计数优化

如果存在大量的重复值,那么上面的方法显然效率变低了,同时需要维护大量的minst
此时可利用引用计数的思想进行优化,minst中不再存储一个int,而是存储一个结构体。结构体中包含:
1、最小值
2、 最小值个数

下面是图解:
image-20220930162744778

struct minVal{
    int val;
    int valCount;
    minVal(int x)
    :valCount(0)
    ,val(x)
    {}
};
class MinStack {
public:
//初始化列表 会初始化自定义成员
    MinStack() {

    }
    
    void push(int val) {
      st.push(val);
      //如果小于min的栈顶元素,就push
      if(min.empty() || val < min.top().val)
      {
          min.push(minVal(val));
          min.top().valCount++;
      }
      //val等于min的top
      else if(!min.empty() && val == min.top().val)
      {
          min.top().valCount++;//计数+1
      }
    }
    
    void pop() {
      //如果stack的top 大于min的栈顶,直接删除
      if(st.top() > min.top().val)
      {
          st.pop();
      }
      else if(st.top() == min.top().val)
      {
          if(min.top().valCount > 1)//大于1 就--count  
          {
              min.top().valCount--;
          }
          else      // 等于1  就pop
          {
              min.pop();
          }
          st.pop();
      }
    }
    
    int top() {
        return st.top();
    }
    
    int getMin() {
        return min.top().val;
    }
private:
    stack<int> st;
    stack<minVal> min;     //辅助栈
};

http://www.niftyadmin.cn/n/5866978.html

相关文章

ubuntu新系统使用指南

1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…

Pretraining Language Models with Text-Attributed Heterogeneous Graphs

Pretraining Language Models with Text-Attributed Heterogeneous Graphs EMNLP 推荐指数&#xff1a;#paper/⭐⭐#​ 贡献&#xff1a; 我们研究了在更复杂的数据结构上预训练LM的问题&#xff0c;即&#xff0c;TAHG。与大多数只能从每个节点的文本描述中学习的PLM不同&…

电机控制的空间矢量调制 (SVPWM)

目录 概述 1 电机控制的空间矢量调制 (SVPWM)介绍 2 实现原理 2.1 设计要求 2.2 SVPWM 的实现 3 SVPWM的C语言 3.1 代码文件 3.2 STM32G4平台上验证 4 源代码文件 概述 本文主要介绍电机控制的空间矢量调制 (SVPWM)&#xff0c;空间矢量调制 (SVPWM) 是感应电机和永磁…

【计算机网络】传输层协议(UDP TCP)

目录 1. 端口号 端口号的划分 2. UDP UDP协议格式 在系统中的描述 缓冲区 使用注意事项 3. TCP 缓冲区 TCP协议格式 标记位 面向字节流 确认应答机制 流量控制 超时重传 连接管理 滑动窗口 延迟应答 捎带应答 快重传 拥塞控制 粘包问题 TIME_WAIT状态 总结 1. 端口…

w227springboot旅游管理系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

【Unity】鱼群效果模拟

鱼群效果模拟 文章目录 鱼群效果模拟Boid算法实现方式version1_CPUversion2_GPUversion3_Multilaterationversion4_Bitonic_Sorting &#xff08;GPU友好&#xff09;version5_Skinning &#xff08;TODO&#xff09; 细节项优化项参考链接 Boid算法 Boid算法是一种模拟群体行…

ASP.NET Core Clean Architecture

文章目录 项目地址一、项目主体1. CQRS1.1 Repository数据库接口1.2 GetEventDetail 完整的Query流程1.3 创建CreateEventCommand并使用validation 2. EFcore层2.1 BaseRepository2.2 CategoryRepository2.3 OrderRepository 3. Email/Excel导出3.1 Email1. IEmail接口层2. Ema…

C++的allactor

https://zhuanlan.zhihu.com/p/693267319 1 双层内存配置器 SGI设计了两层的配置器&#xff0c;也就是第一级配置器和第二级配置器。同时为了自由选择&#xff0c;STL又规定了 __USE_MALLOC 宏&#xff0c;如果它存在则直接调用第一级配置器&#xff0c;不然则直接调用第二级配…