下一个更大元素 I

下一个更大元素 I

CategoryDifficultyLikesDislikes
algorithmsEasy (71.78%)1043-
Tags

stack

Companies

Unknown

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
2
3
4
5
6
输入: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:

1
2
3
4
5
输入: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<sup>4</sup>

  • nums1nums2中所有整数 互不相同

  • nums1 中的所有整数同样出现在 nums2

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

Discussion | Solution

解法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// @lc code=start
impl Solution {
    /// ## 解题思路
    /// - 单调栈
    pub fn next_greater_element(nums1: Vec<i32>, nums2: Vec<i32>) -> Vec<i32> {
        use std::collections::HashMap;
        let mut stack: Vec<usize> = Vec::with_capacity(nums1.len());
        let mut tmp = HashMap::new();
        for (i, &n) in nums2.iter().enumerate() {
            while !stack.is_empty() && n > nums2[*stack.last().unwrap()] {
                if let Some(h) = stack.pop() {
                    tmp.insert(nums2[h], n);
                }
            }
            stack.push(i);
        }

        nums1
            .iter()
            .map(|&n| *(tmp.get(&n).unwrap_or(&-1)))
            .collect()
    }
}
// @lc code=end

struct Solution;

updatedupdated2024-08-252024-08-25