当前位置: 首页 > news >正文

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

在这里插入图片描述

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;     //辅助栈
};

相关文章:

  • Windows 11【1001问】如何下载Windows 11系统镜像
  • 【2025信息安全软考重点考点归纳】实时更新
  • 首发!三维街景数据产品V0.1版发布
  • 网络安全入门|从防护到溯源:HTTP慢速攻击的深度对抗
  • 力扣hot100——二叉树的右视图
  • 基于同轴聚类点云去重的铆钉高度测量
  • [数学] 常用数学公式(逐步更新完善)
  • html中rel、href、src、url的区别
  • Python项目源码33:待办事项列表应用2.0(命令行界面+Json+类)
  • DeepSeek 提示词:高效的提示词设计
  • GIST框架:深度学习助力组织病理学与转录组学的空间整合分析|顶刊精析·25-02-24
  • Oracle Fusion Middleware更改weblogic密码
  • 深度解析SmartGBD助力Android音视频数据接入GB28181平台
  • TCP/IP的分层结构、各层的典型协议,以及与ISO七层模型的差别
  • 【Git版本控制器】第五弹——远程仓库,push,pull,gitignore
  • DeepSeek 细节之 MoE
  • 什么是将应用放在边缘服务器上创建?应用不是在用户手机上吗?边缘计算究竟如何优化?通过两个问题来辨析
  • 2020年蓝桥杯Java B组第二场题目+部分个人解析
  • Maven 基础环境搭建与配置(二)
  • Orange 开源项目 - 集成阿里云大模型
  • 从《缶翁的世界》开始,看吴昌硕等湖州籍书画家对海派的影响
  • 英国警方再逮捕一名涉嫌参与首相住宅纵火案嫌疑人
  • 《日出》华丽的悲凉,何赛飞和赵文瑄演绎出来了
  • 吉利汽车一季度净利润大增264%,称整合极氪后实现整体效益超5%
  • 李公明︱一周书记:当前科学观中的盲点、危机与……人类命运
  • 京东回应外卖系统崩溃:订单暴涨所致,已恢复