给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
示例:
方法一:双栈(比暴力法好一点)
解题思路:
定义两个stack, stack1存num2, stack2作为temp存stack1 pop出来的值默认max=-1 top= stack1.pop()
- if top > num => max = top
- top = num => isfound = True
- top < num => 继续遍历
每找到一个元素的下一个更大的值之后,需要将temp栈中的元素放回到stack中,以便用于剩下的其他元素寻找下一个更大的值。
while temp:stack.append(temp.pop())
代码实战:
class Solution:def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:stack = []result = []# 将nums2元素全部存入stack栈中for i in nums2:stack.append(i)# 遍历nums1 开始寻找下一个更大的元素for num in nums1:max = -1temp = []isFound = Falsewhile not isFound:top = stack.pop()if top > num:max = topelif top == num:isFound = Truetemp.append(top)result.append(max)while temp:stack.append(temp.pop())return result
复杂度分析:
时间复杂度O(MN)
空间复杂度O(N)
方法二:单调栈+HashMap
解题思路:
- 先对 nums2 中的每一个元素,求出它的右边第一个更大的元素;
- 将上一步的对应关系放入哈希表(HashMap)中;
- 再遍历数组 nums1,根据哈希表找出答案。
代码实战:
class Solution:def nextGreaterElement(self, nums1, nums2):d, stack = {}, []for num2 in nums2:while stack and num2 > stack[-1]:d[stack.pop()] = num2stack.append(num2)return [d.get(j, -1) for j in nums1]
复杂度分析:
时间复杂度:O(N + M),分别遍历数组 nums1 和数组 nums2 各一次即可,对于 nums2 中的每个元素,进栈一次,出栈一次;
空间复杂度:O(N)。我们在遍历 nums2 时,需要使用栈,以及哈希映射用来临时存储答案。