返回

从入门到精通:LeetCode 496 彻底征服“下一个更大元素 I”!

闲谈

导读

在计算机科学领域,算法无处不在。它们是解决问题的步骤,可以帮助我们更高效地处理各种各样的任务。LeetCode 是一个在线算法练习平台,提供了数千道算法题供程序员练习。本文将带领您深入探索 LeetCode 上的 496. 下一个更大元素 I 这一算法难题,并帮助您掌握解决此类问题的技巧。

问题陈述

  1. 下一个更大元素 I 的问题陈述如下:

给定两个数组,nums1 和 nums2 ,其中 nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个更大元素。下一个更大元素是指大于该元素的下一个元素。如果不存在下一个更大元素,那么该元素下一个更大元素为 -1 。

例如,给定 nums1 = [4, 1, 2] 和 nums2 = [1, 3, 4, 2],返回 [3, -1, -1]。

  • nums1[0] = 4,nums2 中下一个更大元素是 3。
  • nums1[1] = 1,nums2 中没有下一个更大元素,所以返回 -1。
  • nums1[2] = 2,nums2 中没有下一个更大元素,所以返回 -1。

单调栈算法

为了解决这个问题,我们可以使用单调栈算法。单调栈是一种数据结构,它只允许在栈顶插入或删除元素,并且栈中的元素始终保持单调性。在我们的情况下,单调性意味着栈中的元素从栈底到栈顶始终递减。

使用单调栈算法解决这个问题的步骤如下:

  1. 将 nums2 中的元素依次压入栈中。
  2. 对于 nums1 中的每个元素,依次从栈顶弹出元素,直到栈顶元素小于或等于该元素。
  3. 弹出的元素就是该元素的下一个更大元素。
  4. 如果栈为空,则该元素没有下一个更大元素。

Java 代码实现

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map = new HashMap<>(); // 记录每个元素的下一个更大元素
        Stack<Integer> stack = new Stack<>(); // 单调栈

        for (int num : nums2) {
            while (!stack.isEmpty() && stack.peek() < num) {
                map.put(stack.pop(), num);
            }
            stack.push(num);
        }

        int[] result = new int[nums1.length];
        for (int i = 0; i < nums1.length; i++) {
            result[i] = map.getOrDefault(nums1[i], -1);
        }

        return result;
    }
}

Python 代码实现

def nextGreaterElement(nums1, nums2):
    map = {} # 记录每个元素的下一个更大元素
    stack = [] # 单调栈

    for num in nums2:
        while stack and stack[-1] < num:
            map[stack.pop()] = num
        stack.append(num)

    result = [-1] * len(nums1)
    for i in range(len(nums1)):
        result[i] = map.get(nums1[i], -1)

    return result

复杂度分析

使用单调栈算法解决 496. 下一个更大元素 I 问题的复杂度为 O(n),其中 n 是 nums2 数组的长度。这是因为我们只需要遍历 nums2 数组一次,并且每个元素最多只会被压入和弹出一次。

扩展与思考

  • 除了使用单调栈算法,我们还可以使用哈希表来解决这个问题。哈希表的复杂度也为 O(n)。
  • 本题还可以使用分治算法来解决。分治算法的复杂度为 O(n log n)。
  • 我们可以将这个问题推广到求出数组中所有元素的下一个更大元素。这个问题的复杂度为 O(n^2)。

总结

在本文中,我们详细探索了 LeetCode 上的 496. 下一个更大元素 I 这道算法题。我们介绍了单调栈算法的原理和使用方法,并提供了 Java 和 Python 的代码实现。此外,我们还对本题的复杂度进行了分析,并提出了扩展与思考的问题。希望本文能帮助您更深入地理解算法,并为征服更多算法难题做好准备!