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

单调栈(C/C++)

目录

1. 单调栈的定义

2. 单调栈的常见用途

3. 案例分析

3.1 暴力解法

 3.2 单调栈

 4. 单调栈总结


1. 单调栈的定义

单调栈顾名思义,就是栈内的元素是单调的。根据栈内元素的单调性的不同,可以分为:

单调递增栈:栈内元素是单调递增的栈。

单调递减栈:栈内元素是单调递减的栈。

2. 单调栈的常见用途

单调栈的用途:给定一个序列,指定一个序列中的元素,求解该元素 左侧/右侧 第一个比自身    小/大的元素。

这便是单调栈的常见用途。下面结合具体的例子来理解单调栈哈!N

3. 案例分析

原题链接:

496. 下一个更大元素 I - 力扣(LeetCode)icon-default.png?t=N176https://leetcode.cn/problems/next-greater-element-i/

题目描述:

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

3.1 暴力解法

暴力解法的思路就比较简单了。我们先初始化一个数组 ret,用他的下标表示 nums2 中的每一个元素,对应下标的值表示右侧第一个比它大的元素。然后从后往前(从前向后也行的)遍历 nums2 数组中的元素,遍历每一个元素时向后找比该元素更大的数,如果找到则将对应的结果保存到 下标为遍历元素的位置处,如果没有找到的话就将 -1 保存到下标为遍历元素的位置处。

得到了 nums2 数组中每个元素的右边第一个比自身大的元素后,只需要遍历一次 nums1 数组,在 ret 数组中找到结果就行啦!!

假设 nums2 数组的大小为 N,在求 nums2 数组中的每一个元素右侧第一个比自身大的数时,时间复杂度是一个等差数列的求和,即 O(N*N) 。在遍历 nums1 数组时,因为 nums1 数组中的元素是nums2 数组中元素的子集,遍历 nums1 的时间复杂度为 O(N),所以总的时间复杂度为:O(N^2)。

int* nextGreaterElement(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
{int ret[10010];int j;for(int i = nums2Size - 1; i>=0;i--){for(j =  i + 1; j < nums2Size; j++){if(nums2[j] > nums2[i]){ret[nums2[i]] = nums2[j];break;}}if(j == nums2Size){ret[nums2[i]] = -1;}}*returnSize = nums1Size;int* array = (int*)malloc(sizeof(int)*nums1Size);for(int i = 0;i<nums1Size;i++){array[i] = ret[nums1[i]];}return array;
}

 3.2 单调栈

单调栈的应用思路和双指针算法大体思路是一致的。先分析暴力解法怎么做,然后分析具体题目,找到其中隐藏的性质,从而达到优化时间效率的目的。

emm怎么分析的就不说了,后面会总结的。经过分析该问题发现:在向右找比自身大的元素时,哪些下标更大的,但是值却更小的元素是不可能作为结果输出到 ret 数组的。

 分析到这里我们就可以用单调栈(为啥呢?找的是右侧第一个比自身大的元素,第一这两个字很能说明问题)来解决问题了!!我们这里使用的是用数组模拟的栈哈!效率比STL更高一点。向右找比自身大元素时,需要从后往前遍历 nums2 数组。

我们还是以上面的 3 4 7 2 5 来举例分析,开始遍历到 5 这个元素,此时栈为空,那就表明 5 这个元素右侧没有比自身大的元素(这里也能够说明为啥向右找需要从后往前遍历),将结果保存到 ret 数组。然后将 5 压入栈中。遍历到 2 时发现 2 小于栈顶的元素 5,表明 2 这个元素右侧第一个比自身大的元素是 5,将结果保存到 ret 数组中。遍历到 7 时,发现 7 大于栈顶的元素 2,这就是我们刚才说的,2 是不可能作为结果输出的,所以需要将栈顶的 2 弹出。弹出之后栈顶的元素就是 5 啦,同样 小于 7,但下标大于 7 的下标,需要再次弹出。此时我们发现栈里面已经没有元素了,说明 7 的右侧没有比自身大的元素 返回 -1。然后将 7 压入栈中。其他的元素就同理啦!

 

同样假设 nums2 数组的大小为 N,我们经过分析不难发现,nums2 中的元素 最多被 压栈一次,弹栈一次,所以找 nums2 数组中 右侧第一个 比自身大的数的时间复杂度为 O(N),遍历nums1数组输出结果时也是 O(N),因此总的时间复杂度就是 O(N)。

int* nextGreaterElement(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){int stack[nums2Size + 1], top = 0;int ret[10010];for(int i = nums2Size - 1; i >= 0; i--){while(top && nums2[i] >= stack[top]){top--;}if(top){ret[nums2[i]] = stack[top];}else{ret[nums2[i]] = -1;}stack[++top] = nums2[i];}int* array = (int*)malloc(sizeof(int)*nums1Size);for(int i = 0;i<nums1Size;i++){array[i] = ret[nums1[i]];}*returnSize = nums1Size;return array;
}

 4. 单调栈总结

单调栈的常见用途就是这个啦!显然是有四种情况的:

1:向左找第一个比自身大的数。

2:向左找第一个比自身小的数。

3:向右找第一个比自身大的数。

4:向右找第一个比自身小的数。

通过以上的解题我们可能会有以下问题:

1:从前往后遍历还是从后往前遍历?

答:向右找数从后往前遍历,向左找数从前往后遍历。

2:弹栈的条件之一是大于等于还是小于等于?

答:找比自身大的数是大于等于正在遍历的数,找比自身小的数是小于等于正在遍历的数。

 

相关文章:

单调栈(C/C++)

目录 1. 单调栈的定义 2. 单调栈的常见用途 3. 案例分析 3.1 暴力解法 3.2 单调栈 4. 单调栈总结 1. 单调栈的定义 单调栈顾名思义&#xff0c;就是栈内的元素是单调的。根据栈内元素的单调性的不同&#xff0c;可以分为&#xff1a; 单调递增栈&#xff1a;栈内元素是单…...

算法设计与智能计算 || 专题一: 算法基础

专题一: 算法基础 文章目录专题一: 算法基础1. 算法的定义及特点1.1 算法的基本特征1.2 算法的基本要素1.3 算法的评定2 算法常见执行方法2.1 判断语句2.2 循环语句2.3 综合运用3. 计算复杂度4. 代码的重用5. 类函数的定义与使用5.1 定义类5.2 调用类函数1. 算法的定义及特点 …...

用javascript分类刷leetcode13.单调栈(图文视频讲解)

239. 滑动窗口最大值 (hard) 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,…...

英语基础语法学习(B站英语电力公司)

1. 句子结构 五大基本句型&#xff1a; 主谓主谓宾主谓宾宾主谓宾宾补主系表 谓语&#xff1a; 一般来说&#xff0c;谓语是指主语发出的动作。&#xff08;动词&#xff09;但是很多句子是没有动作的&#xff0c;但是还是必须要有谓语。&#xff08;此时需要be动词&#x…...

【计算机网络】网络层IP协议

文章目录一、认识IP协议二、IP协议头部格式三、IP地址划分1. IP地址分类2. 子网划分四、IP地址数量危机1. IP地址的数量限制2. NAT技术五、私网IP和公网IP六、路由1. 认识路由2. 路由表生成算法一、认识IP协议 IP协议是Internet Protocol&#xff08;互联网协议&#xff09;的…...

Eclipse快捷键大全

编辑类快捷键Ctrl1: 快速修复(最经典的快捷键, 可以解决很多问题, 比如import类、try catch包围等)CtrlShiftF: 格式化当前代码CtrlShiftM: 添加类的import导入CtrlShiftO: 组织类的导入(既有CtrlShiftM的作用,又可以去除没用的导入, 一般用这个导入包)CtrlY: 重做(与CtrlZ相反…...

JavaScript 高级2 :构造函数和原型 d331702016e84f54b3594ae05e0eeac

JavaScript 高级2 &#xff1a;构造函数和原型 Date: January 16, 2023 Text: 构造函数和原型、继承、ES5中的新增方法 目标 能够使用构造函数创建对象 能够说出原型的作用 能够说出访问对象成员的规则 能够使用 ES5新增的一些方法 构造函数和原型 概述 在典型的 OOP 的…...

maven-war-plugin插件 overlays maven-war-plugin翻译

说明 翻译maven-war-plugin插件的部分内容 官方地址为&#xff1a;https://maven.apache.org/plugins/maven-war-plugin/index.html Overview 概述 Introduction 介绍 Apache Maven WAR Plugin apache maven war 插件 The WAR Plugin is responsible for collecting all artifa…...

【数据结构】初识二叉树(二叉树的入门知识)

初识二叉树一、树概念及结构1、树的概念2、树的相关概念3、树的表示4、树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09;二、二叉树概念及结构1、概念2、特殊的二叉树3、二叉树的性质4、二叉树的存储结构三、结语一、树概念及结构 1、树的概念 树是一种非线…...

RV1126笔记三十二:基于 FastDeploy 在 RV1126 上的部署示例(RV1126 上部署 YOLOv5 检测模型测试)

若该文为原创文章,转载请注明原文出处。 FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具, 支持云边端部署。提供超过 🔥160+ Text,Vision, Speech和跨模态模型📦开箱即用的部署体验,并实现🔚端到端的推理性能优化。包括 物体检测、字符识别(OCR)、…...

JVM垃圾回收——G1垃圾收集器

目录 一、什么是G1垃圾收集器 二、G1垃圾收集器的内存划分 三、G1垃圾收集器的收集过程 四、G1收集器的优缺点 五、G1收集器的JVM参数配置 一、什么是G1垃圾收集器 Garbage First(简称G1)收集器是垃圾收集器技术发展史上里程碑式的成果&#xff0c;它摒弃了传统垃圾收集器的…...

C语言深度剖析:关键字

C语言深度剖析:关键字C语言深度剖析:关键字前言定义与声明&#xff08;补充内容&#xff09;最宏大的关键字-auto最快的关键字-register关键字static被冤枉的关键字-sizeof整型在内存中的存储原码、反码、补码大小端补充理解变量内容的存储和取出为什么都是补码整型取值范围关于…...

聊一聊过度设计!

文章目录什么是过度设计&#xff1f;过度设计的坏处如何避免过度设计充分理解问题本身保持简单小步快跑征求其他人的意见总结新手程序员在做设计时&#xff0c;因为缺乏经验&#xff0c;很容易写出欠设计的代码&#xff0c;但有一些经验的程序员&#xff0c;尤其是在刚学习过设…...

程序员在小公司(没有大牛,人少)怎么成长?

大多数小公司都是创业公司&#xff0c;所以它们有着非常独特的“创业心态”。所谓创业心态通常表现为关注快速增长&#xff0c;竭尽所能让公司盈利&#xff0c;或者达成其他一些迫切目标。 在这样一家公司工作的软件开发人员&#xff0c;你极有可能要身兼多职&#xff0c;不能…...

【Fastdfs实战】在本地如何将文件上传到Linux虚拟机

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《Fastdfs连续剧》 坚持做好每一步&#xff0c;幸运之神自然会驾凌在你的身上 目录一. &#x1f981; 前言二. &#x1f981; 上传原理Ⅰ. &#x1f407; 原理图解Ⅱ. &#x1f407; 传输原理三. &#x1f981; 实战演示Ⅰ. &…...

ERP 系统的应用对企业财务会计信息系统内部控制的影响

(一)对企业的财务信息数据进行实时和动态管理传统的财务会计信息系统一般都是采用单一的软件系统&#xff0c;所以在信息的传递及处理上常常不能满足企业的需要&#xff0c;信息与其他部门存在不对称及滞后的现象。而ERP 系统是通过有效的技术手段将企业的各种分散的数据进行完…...

智慧物联网源码带手机端源码 物联网系统源码

在智慧工厂领域&#xff0c;智慧城市领域&#xff0c;都需要对设备进行监控。比如工厂需要对周围环境温度、湿度、气压、电压&#xff0c;灯的开关进行监控。这时候就需要物联网平台来进行管理。 推荐一个基于java开发的物联网平台&#xff0c;前端HTML带云组态、可接入视频监…...

AI绘画进军三次元,有人用它打造赛博女友?(diffusion)

目录0 写在前面1 AI绘画技术飞跃2 效果展示3 环境配置3.1 下载基础模型3.2 更新.NET和模型3.3 下载绘画模型3.4 启动项目3.5 标签配置4 结语0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&a…...

计算机网络高频知识点

目录 一、http状态码 二、浏览器怎么数据缓存 三、强缓存与协商缓存 1、强缓存 2、协商缓存 四、简单请求与复杂请求 五、PUT 请求类型 六、GET请求类型 七、GET 和 POST 的区别 八、跨域 1、什么时候会跨域 2、解决方式 九、计算机网络的七层协议与五层协议分别指…...

谈谈前端性能优化-面试版

前言 当我们去面试的时候&#xff0c;很大概率会被面试官问这么一个问题&#xff1a;你有尝试过对项目做性能优化吗&#xff1f;或者你了解哪些性能优化的方法&#xff1f;听到这个问题的你可能是这样的&#xff1a; 似曾相识但又说不清楚&#xff0c;往往只能零散地说出那么几…...

借助yakit高效构建渗透字典:从历史流量中智能提取关键参数

1. 为什么需要从历史流量中提取渗透字典&#xff1f; 做过渗透测试的朋友都知道&#xff0c;字典的质量直接影响测试效率。传统方式要么用现成的通用字典&#xff0c;要么手动收集整理&#xff0c;前者命中率低&#xff0c;后者耗时费力。我遇到过最头疼的情况是测试一个Web系统…...

电磁学核心概念与解题框架精讲(猴博士风格)

1. 电磁学基础概念拆解&#xff1a;从场强到电势 电场强度E和电势U是电磁学中最基础的两个物理量&#xff0c;就像描述一个人需要身高和体重两个指标一样。很多同学刚开始学电磁学时容易混淆这两个概念&#xff0c;我用一个简单的类比帮大家理解&#xff1a;想象电场强度就像山…...

别再乱用.pem和.key了!用ASN.1 Editor手把手拆解RSA私钥的PKCS#8格式(附OpenSSL 3.1验证)

从文件后缀到密钥本质&#xff1a;用ASN.1 Editor透视RSA私钥的PKCS#8结构 当你在终端输入openssl genpkey -algorithm RSA生成密钥对时&#xff0c;是否曾好奇过.pem文件里那些看似随机的字符究竟隐藏着什么秘密&#xff1f;面对invalid key format的错误提示&#xff0c;又是…...

技术日报|字节DeerFlow今日强势登顶日增3787星总量破4.6万,3D建筑编辑器黑马杀入前二

&#x1f31f; TrendForge 每日精选 - 发现最具潜力的开源项目 &#x1f4ca; 今日共收录 12 个热门项目&#x1f310; 智能中文翻译版 - 项目描述已自动翻译&#xff0c;便于理解&#x1f3c6; 今日最热项目 Top 10 &#x1f947; bytedance/deer-flow 项目简介: DeerFlow是一…...

Frida安装后别急着‘玩’!这5个必做的环境验证与排错步骤你做了吗?

Frida安装后必做的5个环境验证与排错步骤 当你兴冲冲地按照教程安装完Frida和Server&#xff0c;准备开始"玩耍"时&#xff0c;却发现frida-ps -U毫无反应&#xff0c;或者遇到各种连接失败的问题。这种"安装成功却用不了"的尴尬&#xff0c;往往源于环境…...

模电小白必看:3种基本放大电路实战对比(附电路图+避坑指南)

模电入门实战&#xff1a;三大基础放大电路深度解析与避坑指南 刚接触模拟电路时&#xff0c;面对共射极、共集极和共基极这三种基本放大电路&#xff0c;很多初学者都会感到困惑——它们看起来相似&#xff0c;但特性却大不相同。本文将用面包板搭建的真实电路和示波器实测波形…...

大模型赋能多尺度空间智能:从具身感知到地球系统建模的跨学科探索

1. 大模型如何重构空间智能的认知框架 当AlphaGo击败人类棋手时&#xff0c;我们惊叹于AI的策略能力&#xff1b;但当大语言模型开始理解三维空间关系时&#xff0c;这标志着机器认知的质变。空间智能的本质是理解物体间的相对位置、距离和运动规律&#xff0c;这种能力对人类而…...

汽车智能制造时代,哪些服务商助力智慧供应链?

一辆汽车的诞生&#xff0c;背后是一场精密到分钟的大合唱。当生产线以每小时数十台的速度流转时&#xff0c;任何一个零部件的迟到&#xff0c;都可能导致整条线停摆。一个汽车工厂里&#xff0c;单一产线同时生产多种车型&#xff0c;涉及数以万计的SKU零部件。这些物料必须从…...

颠覆式突破:无需模拟器,在Windows系统上直接运行Android应用的革命性方案

颠覆式突破&#xff1a;无需模拟器&#xff0c;在Windows系统上直接运行Android应用的革命性方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想象一下&#xff0c;…...

TrafficMonitor插件系统终极指南:3步打造个性化系统监控中心

TrafficMonitor插件系统终极指南&#xff1a;3步打造个性化系统监控中心 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins TrafficMonitor插件系统是一款强大的扩展框架&#xff0…...