Leetcode 496 下一个更大元素

问题描述

496. 下一个更大元素 I

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:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 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] <= 104
  • nums1nums2中所有整数 互不相同
  • nums1 中的所有整数同样出现在 nums2

**进阶:**你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

解题思路

根据题目我们知道num1与nums2分别是两个不重复的数组。并且nums1是nums2的子集,也就说nums1中的元素必然在nums2中。

由于nums1是nums2的子集,我们可以直接求出nums2的每一个元素,其下一个比它大的元素即可。

并且nums2中的元素互不相同,所以我们可以采用哈希表存储,然后遍历nums1获取相应的结果即可。

寻找下一个比它大的元素,直接使用单调递减栈,即可求出。

func nextGreaterElement(nums1 []int, nums2 []int) []int {

	result := []int{}
	if len(nums1) == 0 || len(nums2) == 0 {
		return result
	}

	m := map[int]int{}

	var stack []int

	for i := 0; i < len(nums2); i++ {

		for len(stack) > 0 && stack[len(stack)-1] < nums2[i] {
			top := stack[len(stack)-1]
			stack = stack[:len(stack)-1] //出栈
			m[top] = nums2[i]
		}

		stack = append(stack, nums2[i])
	}

	for i := 0; i < len(nums1); i++ {
		if v, has := m[nums1[i]]; has {
			result = append(result, v)
		} else {
			result = append(result, -1)
		}
	}
	return result
}

时间复杂度: $O(nums1.length+nums2.length)$

空间复杂度: $O(nums2.length)$