给定两个没有重复元素的数组 nums1
和 nums2
,其中nums1
是 nums2
的子集。找到 nums1
中每个元素在 nums2
中的下一个比其大的值。
nums1
中数字 x 的下一个更大元素是指 x 在 nums2
中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
示例 2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于num1中的数字2,第二个数组中的下一个较大数字是3。
对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。
注意:
nums1
和nums2
中所有元素是唯一的。nums1
和nums2
的数组大小都不超过1000。
解题思路
因为这个问题的提示中提示只有1000
组数据,所以我们很容易想到通过暴力法,也就是对nums1
中的所有数在nums2
中找大于它的第一个元素。
class Solution:
def nextGreaterElement(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
res = list()
for i in nums1:
flag = False
for j in nums2:
if i == j:
flag = True
elif flag and j > i:
res.append(j)
break
else:
res.append(-1)
return res
由于这个问题的特性,所以很容易想到通过单调栈来解决。类似问题
Leetcode 84:柱状图中最大的矩形(超详细的解法!!!)
Leetcode 901:股票价格跨度(超详细的解法!!!)
我们可以通过对nums2
建立一个非严格单调递减或者严格单调递减的栈(因为题目中说明了没有重复元素)。然后对每个元素都计算它的下一个更大的元素,怎么算呢?
我们此时有一个单调递减的栈,然后此时我们碰到了大于栈顶元素的值,那么这个值一定是栈顶元素的下一个更大的元素。我们只需将栈顶元素弹出,然后通过字典记录它的下一更大的元素,最后再维护这个单调栈即可。
class Solution:
def nextGreaterElement(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
dic , stack = dict(), list()
for n in nums2:
while stack and stack[-1] < n:
dic[stack.pop()] = n
stack.append(n)
return [dic.get(i , -1) for i in nums1]
是不是很酷!!!
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!