nums1 中数字 x下一个更大元素 是指 xnums2 中对应位置 右侧第一个x 大的元素。
给你两个 没有重复元素 的数组 nums1nums2 ,下标从 0 开始计数,其中 nums1nums2 的子集。
对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j]下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1
返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素
示例 1:

  1. 输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
  2. 输出:[-1,3,-1]
  3. 解释:nums1 中每个值的下一个更大元素如下所述:
  4. - 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1
  5. - 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3
  6. - 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1

示例 2:

输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。

提示:

  • 1 <= nums1.length <= nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 10^4
  • nums1nums2 中所有整数 互不相同
  • nums1 中的所有整数同样出现在 nums2
    进阶: 你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

    解法一:单调栈

func nextGreaterElement(nums1 []int, nums2 []int) []int {
    var stack []int
    hash := make(map[int]int)
    for _, num := range nums2 {
        for len(stack) > 0 && stack[len(stack)-1] < num {
            hash[stack[len(stack)-1]] = num
            stack = stack[:len(stack)-1]
        }
        stack = append(stack, num)
    }
    for i, num := range nums1 {
        if is, ok := hash[num]; ok {
            nums1[i] = is
        } else {
            nums1[i] = -1
        }
    }
    return nums1
}