LeeCode 496. 下一个更大元素I

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]是如上所述的 下一个更大元素 。

示例 1:

复制代码
输入: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 。

示例 2:

复制代码
输入: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 中

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

答案&测试代码:

cpp 复制代码
void testLeeCode496(void) { // LeeCode496.下一个更大元素I
    class Solution {
        public:
            vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
                // 用于存储 nums2 中每个元素的下一个更大元素
                unordered_map<int, int> nextGreaterNumMap;

                // 单调递减栈,存储元素值。 循环nums2的过程中,会把这个数暂时放入栈中。当后面找到答案时会弹出栈中。
                stack<int> stk;

                // 遍历 nums2,构建映射关系
                for (int num : nums2) {
                    // 当栈不为空,且当前元素大于栈顶元素时
                    // 说明当前元素是栈顶元素的"下一个更大元素"
                    while (!stk.empty() && num > stk.top()) {
                        int topVal = stk.top();
                        stk.pop();
                        nextGreaterNumMap[topVal] = num;
                    }
                    // 将当前元素压入栈。栈中的元素都是等待找到答案的。
                    stk.push(num);
                }

                vector<int> res(nums1.size(), -1);

                for (int i = 0; i < nums1.size(); ++i) {
                    // 如果 nums1[i] 在 Map 中有记录,说明它找到了下一个更大元素
                    // 如果没有记录,ans[i] 保持默认的 -1
                    if (nextGreaterNumMap.count(nums1[i])) {
                        res[i] = nextGreaterNumMap[nums1[i]];
                    }
                }

                return res;
            }
    };

    // test
    vector<int> nums1{4, 1, 2};
    vector<int> nums2{1, 3, 4, 2};
    Solution solution;
    vector<int> res = solution.nextGreaterElement(nums1, nums2);
    printf("结果:\n");
    for (int n : res) {
        printf("%d ", n);
    }
}

运行:

提交到LeeCode:

ok. 单调栈维护栈内元素的单调性‌(单调递增或单调递减),主要用于解决‌"寻找最近的一个更大/更小元素"‌这类问题。

相关推荐
机 _ 长22 分钟前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
早起CaiCai1 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码2 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
猿人谷2 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
青少儿编程课堂4 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
白杨尚青4 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
在猴站学算法5 小时前
(《统计学习方法》(第2版) 李航)第2章 感知机算法
学习·算法·机器学习·统计学习
Rainmicro5 小时前
【无标题】
java·数据库·算法