数据结构——栈——寻找下一个较大元素
题目描述
给出一个数组,向右寻找每一个元素的下一个较大的元素,没有更大的则为-1
举例
{4,6,1,3,2,5}
则求得的答案应为
{6,-1,3,5,5,-1}
题目分析
首先对于这样的题目,我们总是先想到最简单的,那么就是枚举,每次循环一个元素,不停的向右找就可以了。时间复杂度应该是n^2
但是这样肯定是不够用的。
然后我们考虑,这道题我们实际上遇到的问题是什么?
其实简单的说,这道题的意思是,在变化的数组中找到下一个较大的值。
难点在于,数组元素的变化,以及不是找最大值,而是找下一个较大值。
这里就要用到我们的数据结构——栈
如何用栈来存放当前的值使之能在更短的时间内得出结果呢?
依旧结合图来分析。
图解分析
代码分析
/** *求下一个最大值-stack **/ #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <stack> using namespace std; int dataArray[6]={4,6,1,3,2,5}; int resultArray[6]={-1,-1,-1,-1,-1,-1}; //这边的栈保存的是原数组中的位置而不是数组元素本身 stack<int> desStack; int main() { int i=0,n=6; for(i=0; i<n; i++) { while(!desStack.empty() && dataArray[desStack.top()]<dataArray[i]) { resultArray[desStack.top()] = dataArray[i]; desStack.pop(); } desStack.push(i); } for(i=0; i<n; i++) cout<<resultArray[i]<<" "; return 0; }
对于问题的思考
做完这道题我就慢慢的对栈这个数据结构的用法有了一些变化,之前是利用栈去求当前栈的最小值,这里是求下一个最大值。
问题本身可能有区别,但是有一些共性那就是,所要求的数据都是变长的,而所要求的数据都是以一种递增或者递减的顺序排列着,中间夹杂这别的元素。
而栈在这里起的作用就是1、保存了这种递增或者递减的次序。2、即使有新的元素加入就能通过出栈或者入栈来维护需要的答案。
所以,之后,在实际中,如果遇到一些变化长度的数据,但是数据的次序不发生改变,这种时候我们就可以使用栈,来辅助存放数据,来保存数据和求得结果。
对于求栈的最小值,可以参考我之前的博客。
分类:
【102】数据结构和算法[精选]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?