题目描述
给你两个 没有重复元素 的数组 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
运行结果
暴力解法
栈+HashMap