496. Next Greater Element I
You are given two arrays (without duplicates) nums1
and nums2
where nums1
’s elements are subset of nums2
. Find all the next greater numbers for nums1
's elements in the corresponding places of nums2
.
The Next Greater Number of a number x in nums1 is the first greater number to its right in nums2. If it does not exist, output -1 for this number.
Example 1:
Input: nums1 = [4,1,2], nums2 = [1,3,4,2].
Output: [-1,3,-1]
Explanation:
For number 4 in the first array, you cannot find the next greater number for it in the second array, so output -1.
For number 1 in the first array, the next greater number for it in the second array is 3.
For number 2 in the first array, there is no next greater number for it in the second array, so output -1.
Example 2:
Input: nums1 = [2,4], nums2 = [1,2,3,4].
Output: [3,-1]
Explanation:
For number 2 in the first array, the next greater number for it in the second array is 3.
For number 4 in the first array, there is no next greater number for it in the second array, so output -1.
Note:
All elements in nums1 and nums2 are unique.
The length of both nums1 and nums2 would not exceed 1000.
解法
我的思路是使用一个哈希表记录 nums2
中每个元素的索引,然后遍历 nums1
中的每个元素,如果该元素在哈希表里,就获取它在 nums2
中的索引,从该索引向后搜索,返回第一个比该元素大的值,没有的话返回 -1
。
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
m = {}
for i, num in enumerate(nums2):
m[num] = i
res = []
for num in nums1:
if num in m:
cur = m[num] + 1
while cur < len(nums2) and nums2[cur] < num:
cur += 1
res.append(nums2[cur] if cur < len(nums2) else -1)
return res
其实这道题可以简化为 求 nums2
中比每个元素大的下一个元素的位置。例如 nums2 = [1, 3, 4, 2]
那么只要求得 hash = [1: 3, 3: 4, 4: -1, 2: -1]
,再遍历 nums1
取值即可,这种解法的时间复杂度更优。
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
stack, m = [], {}
for num in nums2:
while stack and stack[-1] < num:
m[stack.pop()] = num
stack.append(num)
return [m.get(x, -1) for x in nums1]
Last updated
Was this helpful?