返回
解密下一个更大元素 I:揭秘题目的精妙之处
后端
2023-10-15 10:09:56
下一个更大元素 I:揭秘题目的精妙之处
导言
欢迎来到刷题日记的第 99 篇,这一次,我们将携手破解力扣题目 496. 下一个更大元素 I。这是一道颇具挑战性的数组和栈问题,考验着算法设计和数据结构的运用能力。准备好迎接算法思维的洗礼,我们出发吧!
题目
给定一个数组 nums
,其中每个元素 nums[i]
代表位于下标 i
的元素。对于每个元素 nums[i]
,找到第一个比它大的下一个元素。如果不存在,则用 -1 替换。
例如:
nums = [4, 1, 2]
输出:[-1, 2, -1]
算法设计
解题的关键在于使用单调递减栈。栈是一种数据结构,遵循后进先出(LIFO)原则,即最后加入的元素将第一个被移除。单调递减栈意味着栈中元素按照从大到小的顺序排列。
算法步骤如下:
- 初始化一个空栈
stack
和一个哈希表hash_map
。 - 从数组的末尾开始遍历元素:
- 如果栈为空或当前元素大于栈顶元素,则将当前元素压入栈中,并将该元素作为键,其下一个更大元素作为值添加到
hash_map
中。 - 如果当前元素小于栈顶元素,则弹出栈顶元素并更新
hash_map
,直到栈顶元素大于当前元素。 - 将当前元素作为键,其下一个更大元素(如果存在)作为值添加到
hash_map
中。 - 遍历完成时,栈中剩下的元素表示没有下一个更大元素,将它们的键值对更新为 -1。
代码实现
def next_greater_element(nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
stack = []
hash_map = {}
for i in range(len(nums)-1, -1, -1):
while stack and nums[i] >= nums[stack[-1]]:
stack.pop()
if stack:
hash_map[nums[i]] = nums[stack[-1]]
stack.append(i)
for i in range(len(nums)):
nums[i] = hash_map.get(nums[i], -1)
return nums
时空复杂度分析
- 时间复杂度:O(N),其中 N 为数组长度。遍历数组一次,每个元素最多压入栈一次,弹出栈一次。
- 空间复杂度:O(N),哈希表存储所有元素的下个更大元素。
总结
单调递减栈是一种强大的数据结构,可用于解决一系列问题,包括下一个更大元素问题。通过精心设计算法和运用栈的特性,我们成功破解了力扣 496. 下一个更大元素 I 题目。掌握这种技术将极大提升你解决算法难题的能力,助力你在编程征途中披荆斩棘。
结语
感谢你的陪伴,让我们共同踏上刷题的征途,不断精进算法技能,解锁编程新高度。如果您有任何问题或建议,欢迎在评论区留言,我们一起探索算法世界的奥秘!