栈每日温度(单调栈求解)——LeetCode算法挑战
在LeetCode这个编程挑战平台上,算法和数据结构是解决问题的关键。其中,栈作为一种基础的数据结构,在解决某些问题时有着独特的优势。本文将围绕“每日温度”这一主题,探讨如何使用单调栈解决LeetCode上的每日温度问题。
问题分析
“每日温度”问题要求我们对于每一天的温度,找出下一个温度更高或更低的那一天。具体来说,给定一个数组,其中包含连续的每日温度,我们需要返回一个数组,数组中的每个元素对应原数组中对应元素的下一天温度更高的第一个索引,如果不存在,则返回-1。
单调栈原理
单调栈是一种特殊的栈,它保证了栈中元素的顺序是单调的,即要么始终递增,要么始终递减。在解决“每日温度”问题时,我们可以使用单调递减栈来存储温度的下标。当遍历到当前温度时,如果当前温度低于栈顶温度,则将当前温度的下标入栈;如果当前温度高于栈顶温度,则说明找到了一个温度更高的日子,将栈顶元素出栈,栈顶元素即为所求。
代码实现
以下是一个使用单调栈解决“每日温度”问题的Python代码实现:
python
def dailyTemperatures(temperatures):
stack = [] 单调递减栈
result = [-1] len(temperatures) 初始化结果数组,默认值为-1
for i, temp in enumerate(temperatures):
当栈不为空且当前温度高于栈顶温度时
while stack and temperatures[stack[-1]] < temp:
index = stack.pop() 获取栈顶元素的下标
result[index] = i - index 计算温度差并更新结果数组
stack.append(i) 将当前温度的下标入栈
return result
测试代码
temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
print(dailyTemperatures(temperatures))
代码分析
1. 初始化一个空栈和一个结果数组,结果数组的长度与温度数组相同,默认值为-1。
2. 遍历温度数组,对于每个元素:
- 当栈不为空且当前温度高于栈顶温度时,执行以下操作:
- 将栈顶元素出栈,获取栈顶元素的下标。
- 计算温度差(当前温度下标减去栈顶元素下标),并更新结果数组。
- 将当前温度的下标入栈。
3. 返回结果数组。
时间复杂度和空间复杂度
- 时间复杂度:O(n),其中n为温度数组的长度。因为每个元素最多入栈和出栈一次。
- 空间复杂度:O(n),用于存储结果数组。
总结
本文通过单调栈的原理,详细讲解了如何解决LeetCode上的“每日温度”问题。单调栈作为一种高效的数据结构,在解决类似问题时具有独特的优势。通过理解单调栈的原理和应用,我们可以更好地掌握算法和数据结构,提高编程能力。
Comments NOTHING