496. 下一个更大元素Ⅰ

单调栈

解题思路

  1. 由于 nums1nums2 的子集,要求出 nums1nums2 中下一个更大元素,直接求出 nums2 每个元素的下一个更大元素,再通过 hash 映射求出 nums1nums2 中下一个更大元素;

  2. hashkeyvalue 是元都是元素;

  3. 维护一个单调递减栈,每个元素都与栈顶元素比较,比栈顶元素大则出栈并更新 hash

复杂度

  1. 时间复杂度:O(m + n)

    • 其中 nnums2 的长度,需要遍历 nums2 以计算 nums2 中每个元素右边的第一个更大的值;
    • 其中 mnums1 的长度,需要遍历 nums1 以生成查询结果;
  2. 空间复杂度:O(n),用于存储哈希表;

代码实现

var nextGreaterElement = function (nums1, nums2) {
    // 1. 声明一个 hash 表、单调栈、结果数组
    const map = new Map(), stack = [], res = new Array(nums1.length).fill(-1);

    // 2. 找到所有存在下一个更大的元素,放入 map 中,key:栈顶元素,value:当前元素
    nums2.forEach(item => {
        while (stack.length && item > stack[stack.length - 1]) {
            map.set(stack.pop(), item);
        };
        stack.push(item);
    });

    // 3. 遍历 nums1 将结果推入 res 中
    nums1.forEach((item, inx) => {
        res[inx] = map.get(item) || -1;
    });

    return res;
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 单调栈
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现