LeetCode - 496 下一个更大元素 I

我不是女神ヾ 2023-09-24 12:44 239阅读 0赞

目录

题目来源

题目描述

示例

提示

题目解析

算法源码


题目来源

496. 下一个更大元素 I - 力扣(LeetCode)

题目描述

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素。

示例

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。

输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。

提示

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

题目解析

此题和算法 - 找朋友_伏城之外的博客-CSDN博客

类似,用栈结构解题效率要比双重for更高。

另外,本题还有一个难点就是,本题只要输出nums1指定的数字对应的下一个更大元素,因此我们应该将nums2将每一个数字(定义为obj的key)对应的下一个元素(定义为obj.key的value)的,之后就可以简单地通过

nums1.map(ele => obj[ele]) 来得到题解。

算法源码

  1. /**
  2. * @param {number[]} nums1
  3. * @param {number[]} nums2
  4. * @return {number[]}
  5. */
  6. var nextGreaterElement = function (nums1, nums2) {
  7. let obj = {};
  8. let stack = [];
  9. for (let i = 0; i < nums2.length; i++) {
  10. let ele = nums2[i];
  11. obj[ele] = -1;
  12. while (true) {
  13. if (stack.length === 0) {
  14. stack.push(ele);
  15. break;
  16. } else {
  17. let peekEle = stack[stack.length - 1];
  18. if (ele > peekEle) {
  19. stack.pop();
  20. obj[peekEle] = ele;
  21. } else {
  22. stack.push(ele);
  23. break;
  24. }
  25. }
  26. }
  27. }
  28. return nums1.map((ele) => obj[ele]);
  29. };

cdeb82ba83284f03853207b608043955.png

发表评论

表情:
评论列表 (有 0 条评论,239人围观)

还没有评论,来说两句吧...

相关阅读