题目

一个不含有重复值的数组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)。


思路

数据结构:单调栈,存放数组元素的索引

使用一个栈,并且使该栈从栈顶到栈底的值是严格递减的(因为找的是左右两边比当前位置小的值)。

流程:

  1. 遍历数组
  2. 栈为空或者当前arr[i]大于栈顶元素直接入栈
  3. 若栈不为空,并且当前arr[i]小于栈顶元素 j(假设为j,因为栈里存放的是数组索引值,这里比较的是arr[i]<arr[j]),则需要弹出栈顶元素,则对于弹出的元素j来说左边位置离j最近并且小于arr[j]的值为当前栈顶对应的值,右边位置则是i;
  4. 遍历完数组后,若栈不为空,则对于栈中的所有元素,它们的右边位置最近并且小于他们的值都不存在即为-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——单调栈结构(初阶问题)相关推荐

  1. 栈与队列7——单调栈结构(进阶问题)

    题目 一个含有重复值的数组arr,找到每一个i位置左边和右边离i位置最近且值比arr[i]小的位置,返回所有相应的信息. 举例:arr={3,4,1,5,6,2,7},返回如下的二维数组作为结果:{{ ...

  2. 算法学习12: 单调队列和单调栈

    算法学习12: 单调队列和单调栈 单调队列 单调队列解决的问题: 窗口内最大/最小值的更新结构 单调队列的结构和操作 单调队列的应用 题目一: 生成窗口最大值数组[leetcode 239](http ...

  3. 蒟蒻的ACM数据结构(四)-单调队列和单调栈

    单调队列和单调栈 一.概念 二.实现 三.题目 单调队列 洛谷P1886 滑动窗口 解析 单调栈 [GXOI/GZOI2019]与或和 解析 POJ3250 Bad Hair Day 解析 POJ 2 ...

  4. 【数据结构】栈和队列OJ练习(栈和队列相互实现+循环队列实现)

    目录 前言 1.用队列实现栈 2.用栈实现队列 3.循环队列 前言 前面在学习了栈和队列的实现之后,相信大家对栈和队列的结构和使用方式都有了一些理解. 下面我们就来进行一些练习,这这章的练习相对于原来 ...

  5. sdut 3335 数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descri ...

  6. 算法竞赛入门与进阶 (二)单调队列、单调栈

    栈(stack)和队列( queue ) 1.栈的定义:栈是限定仅在表头进行插入和删除操作的线性表(先进后出) 2.队列的定义:队列是一种特殊的线性表,特殊之处在于 它只允许在表的前端(front)进 ...

  7. 单调队列,单调栈总结

    最近几天接触了单调队列,还接触了单调栈,就总结一下. 其实单调队列,和单调栈都是差不多的数据类型,顾名思义就是在栈和队列上加上单调,单调递增或者单调递减.当要入栈或者入队的时候,要和栈头或者队尾进行比 ...

  8. 栈和队列都是什么结构_数据结构与算法之初识栈与队列

    栈和队列 学习目标 本节我们将初步认识栈和队列,栈和队列是限定插入和删除只能在表的"端点"进行的线性表. 开始学习 01栈 是什么? 限定仅在表尾进行插入和删除操作的线性表,表尾- ...

  9. Java数据结构(1.1):数据结构入门+线性表、算法时间复杂度与空间复杂度、线性表、顺序表、单双链表实现、Java线性表、栈、队列、Java栈与队列。

    数据结构与算法入门 问题1:为什么要学习数据结构          如果说学习语文的最终目的是写小说的话,那么能不能在识字.组词.造句后就直接写小说了,肯定是不行的, 中间还有一个必经的阶段:就是写作 ...

最新文章

  1. 2018-2019-2 20165313 《网络对抗技术》Exp4 恶意代码分析
  2. oracle在日期区间分页查询,Oracle 日期分页
  3. OO--第三单元规格化设计 博客作业
  4. 西伯利亚(Siberia)冷空气
  5. java显示临时变量目录默认路径
  6. 解决:VScode 汉化后 、设置中文后 还显示英文的问题
  7. 互联网金融行业申请评分卡(A卡)简介
  8. 机器学习爬大树之决策树(ID3,C4.5)
  9. 一种验证Linux kernel是否可用的Sanity Check方法
  10. ofd文件怎么复制文字
  11. Ubuntu17.04解决博通网卡问题
  12. 基于WaterDetect的水域面积提取,以长江中上游水面为例
  13. 将华氏度转换为摄氏度的简单代码
  14. PCIe设备的配置过程
  15. 微信公众号开发----测试号的使用
  16. 微信赚钱越来越难?该如何转型?
  17. 小学计算机奥林匹克试题,[转载]合肥市第三十届青少年信息学奥林匹克竞赛(小学组)试题...
  18. SwiSH max——简易动画制作的最佳选择
  19. Java基于JSP的家教预约平台
  20. Windows系统信息页面OEM信息自定义编辑方法

热门文章

  1. AI一分钟 | 阿里云放大招要揽1000名AI人才,川普AI守国论遭遇54名科学家反对
  2. UUID正在被NanoID取代?
  3. 为什么不推荐使用uuid或者雪花id作为主键?
  4. 一次搞懂 Runnable、Callable、Future、FutureTask,不懂不要钱!
  5. 通用的底层埋点都是怎么做的?
  6. 字节跳动一面:i++ 是线程安全的吗?
  7. 用漫画了解 Linux 内核到底长啥样!
  8. PyTorch Cookbook(常用代码合集)
  9. 每日一问 - 关于决策树算法
  10. combo:机器学习模型合并工具库