LeetCode(力扣) 496题:下一个更大元素 I----栈+HashMap求解附带详细注释

题目描述

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

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

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

示例:

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

思路分析
刚看到这道题的时候,觉得很简单,所以直接采用暴力法求解,虽然运行成功,但是时间复杂度有点高,经翻阅查找资料,找到用栈+Hashmap来做的方法。大致思路就是先在把nums2中每个元素与其下一个最大的值的对应关系找出来并保存在HashMap中,最后直接遍历nums1,根据HashMap中的映射关系找答案了。自己在nums2找映射关系的时候卡了好一会儿才搞明白。

代码

class Solution:
    def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # *********暴力解*********
        # res = []
        # n1 = len(nums1)
        # for i in range(n1):
        #     ind = nums2.index(nums1[i])
        #     if ind == len(nums2) - 1:
        #         res.append(-1)
        #     sub_nums2 = nums2[ind+1:]
        #     for k, j in enumerate(sub_nums2):
        #         if j > nums1[i]:
        #             res.append(j)
        #             break
        #         if k == len(sub_nums2) - 1 and j <= nums1[i]:
        #             res.append(-1)
        # return res

        # **********栈+HashMap解法**********
        stack = [] # 定义栈
        res_dict = {i:-1 for i in nums2} # 给每个元素的大1元素赋初始值-1
        for i in nums2:
            # 第一个元素先行入栈,后边的元素与其比较,
            # 如果大于,则较小的元素出栈,建立对应关系,
            # 较大的元素入栈,依次循环
            while stack and i > stack[-1]:
                small = stack.pop()
                res_dict[small] = i
            stack.append(i)
        # 根据建立好的对应关系遍历nums1
        res = []
        for i in nums1:
            res.append(res_dict[i])
        return res

运行结果

暴力解法LeetCode(力扣) 496题:下一个更大元素 I----栈+HashMap求解附带详细注释

栈+HashMapLeetCode(力扣) 496题:下一个更大元素 I----栈+HashMap求解附带详细注释

上一篇:在 Ubuntu 上安装 K8S教程


下一篇:LeetCode300题计划——4. 寻找两个正序数组的中位数