数据结构与算法之 leetcode 栈每日温度解法 单调递增栈

数据结构与算法阿木 发布于 10 天前 3 次阅读


栈每日温度解法:LeetCode 739题深度解析

在LeetCode编程挑战中,栈是一种常用的数据结构,尤其在解决与温度变化相关的问题时。其中,第739题“每日温度”就是一道典型的利用栈解决温度变化的题目。本文将深入解析这一题目的解题思路,并详细展示如何使用单调递增栈来解决这一问题。

题目描述

给定一个数组`temperatures`,表示每天的温度。要求计算对于每一天,下一个更高温度是哪一天,如果没有更高温度,则返回`-1`。

例如,对于`temperatures = [73, 74, 75, 71, 69, 72, 76, 73]`,返回的数组应该是`[1, 1, 4, 2, 1, 1, 7, 4]`。

解题思路

要解决这个问题,我们可以使用单调递增栈。单调递增栈是一种特殊的栈,它只存储递增的元素。当我们遇到一个比栈顶元素还要高的温度时,说明栈顶元素的下一天就是我们要找的更高温度的日期。

以下是具体的解题步骤:

1. 初始化一个栈和一个结果数组。

2. 遍历温度数组,对于每个元素:

- 如果栈为空或者当前温度比栈顶温度高,将当前索引入栈。

- 如果当前温度不高于栈顶温度,则从栈中弹出元素,并记录弹出的索引。

- 如果栈为空,则结果数组对应位置为`-1`。

- 如果栈不为空,则结果数组对应位置为当前索引与栈顶索引的差值。

3. 继续遍历数组,直到所有元素都被处理。

代码实现

下面是使用Python实现的代码:

python

def dailyTemperatures(temperatures):


stack = []


result = [-1] len(temperatures)



for i, temp in enumerate(temperatures):


while stack and temp > temperatures[stack[-1]]:


index = stack.pop()


result[index] = i - index


stack.append(i)



return result

测试代码


temperatures = [73, 74, 75, 71, 69, 72, 76, 73]


print(dailyTemperatures(temperatures))


时间复杂度和空间复杂度

- 时间复杂度:O(n),其中n是温度数组的长度。每个元素最多被压入和弹出栈一次。

- 空间复杂度:O(n),用于存储结果数组。

总结

通过使用单调递增栈,我们可以高效地解决LeetCode 739题“每日温度”。这种方法不仅简洁,而且易于理解。在实际编程中,掌握这种数据结构和算法对于解决类似问题非常有帮助。

扩展

除了单调递增栈,还可以使用其他方法来解决这道题,例如:

- 使用哈希表记录每个温度出现的最后位置。

- 使用双指针技术。

每种方法都有其优缺点,选择合适的方法取决于具体的应用场景和性能要求。