栈与队列7——单调栈结构(初阶问题)
题目
一个不含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息。
举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{-1,2},{0,2},{-1,-1},{2,5},{3,5},{2,-1},{5,-1}},其中-1表示不存在
要求
如果arr长度为N,时间复杂度达到O(N)。
思路
数据结构:单调栈,存放数组元素的索引
使用一个栈,并且使该栈从栈顶到栈底的值是严格递减的(因为找的是左右两边比当前位置小的值)。
流程:
- 遍历数组
- 栈为空或者当前arr[i]大于栈顶元素直接入栈
- 若栈不为空,并且当前arr[i]小于栈顶元素 j(假设为j,因为栈里存放的是数组索引值,这里比较的是arr[i]<arr[j]),则需要弹出栈顶元素,则对于弹出的元素j来说左边位置离j最近并且小于arr[j]的值为当前栈顶对应的值,右边位置则是i;
- 遍历完数组后,若栈不为空,则对于栈中的所有元素,它们的右边位置最近并且小于他们的值都不存在即为-1;依次弹出栈顶元素 j (假设为j),j的右边为-1,左边位置为当前栈顶元素;完成!
源码
public int[][] getNearLessNoRepeat(int[] arr){//返回的二维数组,代表左右的位置int[][] res=new int[arr.length][2];//栈Stack<Integer> stack=new Stack<Integer>();//遍历数组for(int i=0;i<arr.length;i++){//栈不为空,并且当前数组元素小于栈顶元素while(!stack.isEmpty()&&arr[stack.peek()]>arr[i]){int popIndex=stack.pop();int leftlessIndex=stack.isEmpty()?-1:stack.peek();int rightlessIndex=i;//针对于弹出的栈顶元素的左右最小的值的位置res[popIndex][0]=leftlessIndex;res[popIndex][1]=rightlessIndex;}stack.push(i);}while(!stack.isEmpty()){int popIndex=stack.pop();int leftlessIndex=stack.isEmpty()?-1:stack.peek();int rightlessIndex=-1;res[popIndex][0]=leftlessIndex;res[popIndex][1]=rightlessIndex;}return res;
}
如果有不理解的,欢迎随时留言交流。
栈与队列7——单调栈结构(初阶问题)相关推荐
- 栈与队列7——单调栈结构(进阶问题)
题目 一个含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{ ...
- 算法学习12: 单调队列和单调栈
算法学习12: 单调队列和单调栈 单调队列 单调队列解决的问题: 窗口内最大/最小值的更新结构 单调队列的结构和操作 单调队列的应用 题目一: 生成窗口最大值数组[leetcode 239](http ...
- 蒟蒻的ACM数据结构(四)-单调队列和单调栈
单调队列和单调栈 一.概念 二.实现 三.题目 单调队列 洛谷P1886 滑动窗口 解析 单调栈 [GXOI/GZOI2019]与或和 解析 POJ3250 Bad Hair Day 解析 POJ 2 ...
- 【数据结构】栈和队列OJ练习(栈和队列相互实现+循环队列实现)
目录 前言 1.用队列实现栈 2.用栈实现队列 3.循环队列 前言 前面在学习了栈和队列的实现之后,相信大家对栈和队列的结构和使用方式都有了一些理解. 下面我们就来进行一些练习,这这章的练习相对于原来 ...
- sdut 3335 数据结构实验之栈与队列八:栈的基本操作
数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descri ...
- 算法竞赛入门与进阶 (二)单调队列、单调栈
栈(stack)和队列( queue ) 1.栈的定义:栈是限定仅在表头进行插入和删除操作的线性表(先进后出) 2.队列的定义:队列是一种特殊的线性表,特殊之处在于 它只允许在表的前端(front)进 ...
- 单调队列,单调栈总结
最近几天接触了单调队列,还接触了单调栈,就总结一下. 其实单调队列,和单调栈都是差不多的数据类型,顾名思义就是在栈和队列上加上单调,单调递增或者单调递减.当要入栈或者入队的时候,要和栈头或者队尾进行比 ...
- 栈和队列都是什么结构_数据结构与算法之初识栈与队列
栈和队列 学习目标 本节我们将初步认识栈和队列,栈和队列是限定插入和删除只能在表的"端点"进行的线性表. 开始学习 01栈 是什么? 限定仅在表尾进行插入和删除操作的线性表,表尾- ...
- Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。
数据结构与算法入门 问题1:为什么要学习数据结构 如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...
最新文章
- 2018-2019-2 20165313 《网络对抗技术》Exp4 恶意代码分析
- oracle在日期区间分页查询,Oracle 日期分页
- OO--第三单元规格化设计 博客作业
- 西伯利亚(Siberia)冷空气
- java显示临时变量目录默认路径
- 解决:VScode 汉化后 、设置中文后 还显示英文的问题
- 互联网金融行业申请评分卡(A卡)简介
- 机器学习爬大树之决策树(ID3,C4.5)
- 一种验证Linux kernel是否可用的Sanity Check方法
- ofd文件怎么复制文字
- Ubuntu17.04解决博通网卡问题
- 基于WaterDetect的水域面积提取,以长江中上游水面为例
- 将华氏度转换为摄氏度的简单代码
- PCIe设备的配置过程
- 微信公众号开发----测试号的使用
- 微信赚钱越来越难?该如何转型?
- 小学计算机奥林匹克试题,[转载]合肥市第三十届青少年信息学奥林匹克竞赛(小学组)试题...
- SwiSH max——简易动画制作的最佳选择
- Java基于JSP的家教预约平台
- Windows系统信息页面OEM信息自定义编辑方法