问题
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]
分析与代码实现
class Solution(object):
def nextGreaterElement(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
# 方法一:暴力 时间复杂度0(mn)
# l=[]
# for i in nums1:
# tmp=-1
# maxItem=-1
# for index,value in enumerate(nums2):
# if tmp!=-1:
# if value>tmp:
# maxItem=value
# break
# elif value==i:
# tmp=i
# continue
# l.append(maxItem)
# return l
# 进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?
# 暴力法的时间复杂度大,是因为我们需要为nums1中每个元素 遍历nums2找到对应位置然后继续遍历确定下一个最大元素
# 可不可以不遍历nums2,直接访问哈希表key就是nums2中的每个元素值,value就是key对应的nums2中的下一个最大元素呢
# 如何弄出这个哈希表的key-value???利用单调栈
stack=list()
d=dict()
l=[]
for i in range(len(nums2)-1,-1,-1):
while len(stack)>0 and stack[-1]<nums2[i]:
stack.pop(-1)
if len(stack)>0:
d[nums2[i]]=stack[-1]
else:
d[nums2[i]]=-1
stack.append(nums2[i])
for i in nums1:
# 是子集
l.append(d[i])
return l