返回

每日温度:解题思路和具体实现

后端

各位算法爱好者,今日我们将深入探讨一道经典算法题——每日温度。这道题考查了我们使用栈和贪心算法解决问题的技巧。做好准备,让我们一起解开这道谜题!

问题

每日温度是一道 leetcode 中级算法题,题目如下:

给定一个整数数组 temperatures,其中每个元素 temperatures[i] 表示某一天的温度。对于一个给定的温度 temperatures[i],请你找到下一个比其高的温度。如果这样的温度不存在,就返回 0。

解题思路

这道题的解题思路可以概括为:

  1. 使用栈来存储索引。栈中元素按照温度从低到高排列,栈顶元素始终是温度最高的。
  2. 遍历数组,对于每个元素 temperatures[i]:
    • 如果栈为空,或者栈顶元素的温度大于或等于 temperatures[i],则将 temperatures[i] 的索引压入栈中。
    • 否则,重复以下步骤,直到栈为空或者栈顶元素的温度小于 temperatures[i]:
      • 将栈顶元素的索引对应的温度更新为 temperatures[i] - 栈顶元素的索引。
      • 弹出栈顶元素。
    • 将 temperatures[i] 的索引压入栈中。

具体实现

根据上述思路,我们可以用 Python 实现解法如下:

def dailyTemperatures(temperatures):
    """
    :type temperatures: List[int]
    :rtype: List[int]
    """
    stack = []
    result = [0] * len(temperatures)

    for i, temperature in enumerate(temperatures):
        while stack and temperature > temperatures[stack[-1]]:
            idx = stack.pop()
            result[idx] = i - idx
        stack.append(i)

    return result

复杂度分析

  • 时间复杂度:O(n),其中 n 是 temperatures 的长度。
  • 空间复杂度:O(n),因为我们使用栈存储索引。

示例

输入:temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
输出:[1, 1, 4, 2, 1, 1, 0, 0]

总结

每日温度算法充分运用了栈和贪心算法的思想,帮助我们高效地解决了这道经典题目。掌握了这道题的解题思路和具体实现,将大大提升我们解决算法问题的信心和能力。希望这篇文章对各位算法爱好者有所帮助,让我们在算法的道路上不断探索和进步!