给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

示例 1:

输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
注意: 输入数组的长度不会超过 10000。

解题思路

维护一个单调递增的栈,因为是从左到右进行遍历的,所以越靠近栈顶的元素位置越接近当前元素,栈顶到栈底的单调递增的,所以当只需要不断出栈直到遇到比当前元素大的就是当前位置的结果,并且将当前元素进栈。

代码

class Solution {public int[] nextGreaterElements(int[] nums) {int n=nums.length;Stack<Integer> stack=new Stack<>();int[] ints = new int[n];Arrays.fill(ints,-1);boolean[] booleans = new boolean[n];for (int i = n-1; i >=0; i--) {if(booleans[i]) continue;while (!stack.isEmpty()&&nums[i]>=stack.peek())//找出一个比当前元素大的stack.pop();if(!stack.isEmpty())//存在一个比当前元素大的,则加入结果并且标记为已找到{ints[i]=stack.peek(); booleans[i]=true;} stack.push(nums[i]);}for (int i = n-1; i >=0; i--) {//因为是循环数组,所以需要再计算一次if(booleans[i]) continue;while (!stack.isEmpty()&&nums[i]>=stack.peek())stack.pop();if(!stack.isEmpty()){ints[i]=stack.peek(); booleans[i]=true;}stack.push(nums[i]);}return ints;}
}

leetcode 503. 下一个更大元素 II(单调栈)相关推荐

  1. Java实现 LeetCode 503 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  2. leetcode 503. 下一个更大元素 II

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...

  3. 解题记录 LeetCode 下一个更大元素 II 单调栈

    题目链接: https://leetcode-cn.com/problems/next-greater-element-ii/ 题意: 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素), ...

  4. 503. 下一个更大元素 II

    503. 下一个更大元素 II 题目 我的解答 分析 解答 官方解法 题目 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是 ...

  5. 496. 下一个更大元素 I/503. 下一个更大元素 II/739. 每日温度

    2020-05-10 1.题目描述 下一个更大元素 2.题解 1.直接进行暴力搜索 2.既然题目的标签是栈,就应该用到栈先进后出的特性,参考了官方的题解之后,我认为最能体现这种 特性的就是要找到下一个 ...

  6. 力扣【下一个更大元素】leetcode-503.下一个更大元素 Ⅱ:单调栈解法+循环数组解法

    题目: 思路与解法: 1.如果是暴力法,只需要遍历就可以了,但是那样的话时间复杂度就是O(N^2); 2.可以把这几个数字,抽象成为高度不一样的柱子: 3.寻找的过程,就是从当前柱子去看,被后面的哪一 ...

  7. Leetcode 503:下一个更大元素 II(超详细的解法!!!)

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...

  8. LeetCode 496. 下一个更大元素 I

    599. 两个列表的最小索引总和 添加链接描述 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和 ...

  9. LeetCode 496. 下一个更大元素 I(哈希)

    1. 题目 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x ...

最新文章

  1. 一小段jQuery代码的分析与优化
  2. 服务器操作系统的安全策略,服务器操作系统的安全策略
  3. 百度地图android自定义文字,androidsdk | 百度地图API SDK
  4. Linux系统调用FAQ
  5. Linux server配置安装Java,Tomcat服务器
  6. 对DotNet分布式应用搭建的考虑(引用)
  7. php如何循环输出图片,[图片 显示] 缩图循环显示(php,mysql,script)-PHP教程,PHP应用
  8. xfce4开始菜单中的小老鼠图标不见了
  9. .net core mvc初级教程(六)
  10. java什么是接口_Java接口是什么
  11. 【亲测】2022最新H5手机微商城运营源码/简约轻量版/对接支付个人免签接口/带搭建教程
  12. 微信小程序最全Tab选项卡,你要的功能都在这里啦
  13. ZZULIOJ.1102: 火车票退票费计算(函数专题)
  14. jenkins 管理员邮箱配置
  15. 终于来了!腾讯数据分析证书!
  16. GetDriveType将移动硬盘识别为DRIVE_FIXED 而不是DRIVE_REMOVABLE移动设备的问题
  17. 转行成为大数据工程师要怎么做?
  18. Towards 3D Human Pose Estimation in the Wild: a Weakly-supervised Approach论文翻译
  19. workflow工作流(二):34张表
  20. matlab求解器是什么,Matlab理解ode求解器

热门文章

  1. 数据结构(四)串的顺序存储
  2. 哲学家就餐(避免死锁)(多进程版)
  3. 比特币源码学习笔记(一)
  4. Hadoop集群安装与配置
  5. Java这些高端技术只有你还不知道,薪资翻倍
  6. 大厂也在用的6种数据脱敏方案,醍醐灌顶!
  7. 使用Nginx+uWSGI部署Django项目
  8. 使用vim打开文件的16进制形式,编辑和全文替换
  9. 个人工作总结04(冲刺二)
  10. 记录一些容易忘记的属性 -- UITabBarController