返回

「LeetCode系列」下一个更大元素问题:突破困境与成长

闲谈

在「LeetCode系列」的挑战之旅中,我们迎来了下一个更大元素问题。这是一个颇具趣味性和挑战性的问题,需要我们运用算法和数据结构的知识,来找出循环数组中每个元素的下一个更大元素。

「LeetCode系列」下一个更大元素问题:

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。 数字x的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着应该循环地搜索它的下一个更大的数。如果不存在下一个更大的元素,输出 -1。

示例 1:

输入: [2,1,2,4,3]
输出: [4,4,4,-1,-1]
解释: 
2的下一个更大元素是4.
1的下一个更大元素是4.
2的下一个更大元素是4.
4的下一个更大元素不存在,所以输出 -1.
3的下一个更大元素不存在,所以输出 -1.

示例 2:

输入: [5,4,3,2,1]
输出: [-1,-1,-1,-1,-1]
解释: 
5的下一个更大元素不存在,所以输出 -1.
4的下一个更大元素不存在,所以输出 -1.
3的下一个更大元素不存在,所以输出 -1.
2的下一个更大元素不存在,所以输出 -1.
1的下一个更大元素不存在,所以输出 -1.

解决方案:

我们可以使用一个栈来解决这个问题。我们将数组中的元素依次压入栈中,并将栈顶元素记为当前元素。然后,我们将当前元素与栈中其他元素进行比较,如果找到一个比当前元素大的元素,则该元素就是当前元素的下一个更大元素。否则,我们将当前元素弹出栈,并继续比较下一个元素。

具体步骤如下:

  1. 初始化一个空栈。
  2. 将数组中的第一个元素压入栈中。
  3. 从数组中的第二个元素开始,依次将每个元素压入栈中。
  4. 将栈顶元素记为当前元素。
  5. 将当前元素与栈中其他元素进行比较,如果找到一个比当前元素大的元素,则该元素就是当前元素的下一个更大元素。
  6. 否则,我们将当前元素弹出栈,并继续比较下一个元素。
  7. 重复步骤 4-6,直到数组中的所有元素都已被处理。
  8. 将栈中剩余的元素依次弹出,并将其下一个更大元素设为 -1。

时间复杂度:

O(n),其中 n 是数组的长度。

空间复杂度:

O(n),其中 n 是数组的长度。

示例代码:

def next_greater_element(nums):
    stack = []
    result = [-1] * len(nums)
    for i in range(len(nums)):
        while stack and nums[stack[-1]] < nums[i]:
            result[stack.pop()] = nums[i]
        stack.append(i)
    return result

# 测试代码
nums = [2, 1, 2, 4, 3]
print(next_greater_element(nums))  # [4, 4, 4, -1, -1]

nums = [5, 4, 3, 2, 1]
print(next_greater_element(nums))  # [-1, -1, -1, -1, -1]

总结:

下一个更大元素问题是一个颇具挑战性的问题,需要我们运用算法和数据结构的知识,来找出循环数组中每个元素的下一个更大元素。通过使用栈来解决这个问题,我们可以有效地找出每个元素的下一个更大元素。