题目描述
给定两个没有重复元素的数组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]
- 解释
对于nums1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出-1。 对于nums1中的数字1,第二个数组中数字1右边的下一个较大数字是3。 对于nums1中的数字2,第二个数组中没有下一个更大的数字,因此输出-1。
-
示例2
- 输入
nums1 = [2, 4], nums2 = [1, 2, 3, 4]
- 输出
[3, -1]
- 解释
对于nums1中的数字2,第二个数组中下一个较大数字是3。 对于nums1中的数字4,第二个数组中没有下一个更大的数字,因此输出-1。
-
注意
1. nums1和nums2中所有元素是唯一的。
2. nums1和nums2的数组大小都不超过1000。
循环遍历寻找
索引当前列表nums1中元素在列表nums2中的下标值,遍历寻找下一个比其大的数字,没有则默认为-1。
def nextGreaterElement(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
res = [-1] * len(nums1)
for ni in range(len(nums1)):
current = nums1[ni]
idx = nums2.index(current)
for nj in range(idx, len(nums2)):
if nums2[nj] > current:
res[ni] = nums2[nj]
break
return res
利用栈结构优化构建字典
根据列表nums2利用栈的FILO特性,计算出当前元素在此列表nums2中下一个较大的数字存储在字典中。
def nextGreaterElement(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
next_value_dict, current_stack = {}, []
for nu in nums2:
while current_stack and current_stack[-1] < nu:
next_value_dict[current_stack.pop()] = nu
current_stack.append(nu)
return [next_value_dict.get(num, -1) for num in nums1]
(最近更新:2019年06月17日)