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?