题目链接:https://leetcode-cn.com/problems/next-greater-element-i/

题目描述

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

测试用例

示例 1:

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
    对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。
    对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。
    对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1 。

示例 2:

输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
    对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。
    对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出 -1 。

提示:

1 <= nums1.length <= nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 10^4
nums1和nums2中所有整数 互不相同
nums1 中的所有整数同样出现在 nums2 中

进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

题解

单调栈。维护使得:栈中的元素从栈顶到栈底是单调不降的。

当我们遇到一个新的元素 nums2[i] 时,我们判断栈顶元素是否小于 nums2[i],如果是,那么栈顶元素的下一个更大元素即为 nums2[i],我们将栈顶元素出栈。重复这一操作,直到栈为空或者栈顶元素大于 nums2[i]。此时我们将 nums2[i] 入栈,保持栈的单调性,并对接下来的 nums2[i + 1], nums2[i + 2] ... 执行同样的操作。

时间复杂度:

空间复杂度:

代码

class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {int len1 = nums1.length, len2 = nums2.length;Deque<Integer> stack = new ArrayDeque<>();Map<Integer, Integer> map = new HashMap<Integer, Integer>();// 先处理nums2,将对应关系存入mapfor (int i = 0; i < len2; i++){while (!stack.isEmpty() && stack.peekLast() < nums2[i]){map.put(stack.removeLast(), nums2[i]);}stack.addLast(nums2[i]);}int[] ret = new int[len1];// 查询nums1对应的结果for (int i = 0; i < len1; i++){ret[i] = map.getOrDefault(nums1[i], -1);}return ret;}
}

【LeetCode】496. 下一个更大元素 I 【单调栈】相关推荐

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

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

  2. Java实现 LeetCode 496 下一个更大元素 I

    496. 下一个更大元素 I 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nu ...

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

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

  4. LeetCode 496. 下一个更大元素 I 解题思路及C++实现

    解题思路: 因为这两个int型的vector中不包含重复元素,所以考虑使用c++中的unordered_map,对num2进行遍历,找到每一个元素的下一个更大元素,这样的话,时间复杂度就是O(n). ...

  5. leetcode 496. 下一个更大元素 I(Java版,单调栈解法)

    题目 https://leetcode-cn.com/problems/next-greater-element-i/ 题解 通过Stack.HashMap解决,经典的单调栈问题 先遍历大数组nums ...

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

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

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

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

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

    496. 下一个更大元素 I 题目 分析 我的解答 官方解答 题目 给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 ...

  9. 496.下一个更大元素I

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

最新文章

  1. 生信服务器入门级基本设置
  2. 19/100. Subtree of Another Tree
  3. [深度学习] 自然语言处理 --- Self-Attention(二) 动画与代码演示
  4. 为什么要使用Entity Framework
  5. python asyncio 异步编程-协程 2
  6. Javascript如何显示完整的大数加法结果而不是科学计数法形式
  7. ldirectord实现高可用负载集群
  8. .net core 部署在Linux系统上运行的环境搭建
  9. elixir官方入门教程 递归
  10. Java的各种中文乱码解决方法
  11. 04-cmake语法-STREQUAL
  12. 线性表的顺序表示---练习题(算法设计题
  13. 电脑键盘注册表已损坏导致无法输入信息的修复方式
  14. RxJava 沉思录(一):你认为 RxJava 真的好用吗?
  15. ffmpeg common.mak:159: *** missing separator. Stop.
  16. 使用formality的技巧
  17. html5猜大王游戏,5月8日维护:新副本金兜洞兕大王部分测试
  18. java-练习题-小学算术题
  19. 深度学习——损失函数(Regression Loss、Classification Loss)
  20. sketch交互动效能导入html吗,UI设计利器Sketch +最新交互利器 Framer 配合使用和动效制作...

热门文章

  1. 交叉火力dsp手机调音软件_济南冠铭改装东风本田CRV音响二次升级丹拿232+交叉火力A6XS数字音频处理器...
  2. 【自动化】初见 - 最强浏览器插件 《油猴Tampermonkey》 开发和发布
  3. 如何用计算机快捷键代替鼠标,用鼠标代替快捷键,你的 Windows 还能这么操作?...
  4. vue-cli4+vue2兼容安卓7(h5嵌入app),一步步排查发现问题并且解决(vue白屏)
  5. ssecorp elpmis elif pmb
  6. linux文本编辑器里d,Linux 文 本 编 辑 器 J e d
  7. EDIUS教程之怎样快速设置采集应用
  8. 虾皮店铺一下子就爆单了,shopee店铺装修用起来的好处!
  9. RFID在身份证中的应用
  10. 循序渐进学运维-shell脚本实战专栏