返回
「LeetCode系列」下一个更大元素问题:突破困境与成长
闲谈
2023-12-22 02:13:22
在「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.
解决方案:
我们可以使用一个栈来解决这个问题。我们将数组中的元素依次压入栈中,并将栈顶元素记为当前元素。然后,我们将当前元素与栈中其他元素进行比较,如果找到一个比当前元素大的元素,则该元素就是当前元素的下一个更大元素。否则,我们将当前元素弹出栈,并继续比较下一个元素。
具体步骤如下:
- 初始化一个空栈。
- 将数组中的第一个元素压入栈中。
- 从数组中的第二个元素开始,依次将每个元素压入栈中。
- 将栈顶元素记为当前元素。
- 将当前元素与栈中其他元素进行比较,如果找到一个比当前元素大的元素,则该元素就是当前元素的下一个更大元素。
- 否则,我们将当前元素弹出栈,并继续比较下一个元素。
- 重复步骤 4-6,直到数组中的所有元素都已被处理。
- 将栈中剩余的元素依次弹出,并将其下一个更大元素设为 -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]
总结:
下一个更大元素问题是一个颇具挑战性的问题,需要我们运用算法和数据结构的知识,来找出循环数组中每个元素的下一个更大元素。通过使用栈来解决这个问题,我们可以有效地找出每个元素的下一个更大元素。