📜  第二天温度较高的剩余天数(1)

📅  最后修改于: 2023-12-03 15:11:31.852000             🧑  作者: Mango

第二天温度较高的剩余天数

开发一个函数,输入一个由表示每天温度的数字组成的列表,输出在这个列表中,有多少个元素是比后续的元素温度更高的。具体而言,如果在第 i 天之后有某一天的温度更高,则称这是一个“第 i 天的温度更高”元素。要求只使用 O(n) 的时间复杂度。

示例
示例1

输入: [73, 74, 75, 71, 69, 72, 76, 73]

输出: [1, 1, 4, 2, 1, 1, 0, 0]

解释:

  • 对于 i = 0, 后续的元素中只有一个元素更高,因此输出为 1。
  • 对于 i = 1, 只有一个元素更高,后续元素中的最后一个元素,因此输出为 1。
  • 对于 i = 2,后续元素中的三个元素都比它高温度高,输出为 4。
  • 对于 i = 3,后续元素中有两个元素比它高,输出为 2。
  • 对于 i = 4,后续元素中只有一个元素更高,因此输出为 1。
  • 对于 i = 5,后续元素中只有一个元素更高,因此输出为 1。
  • 对于 i = 6,后续没有更高温度的元素,所以输出为 0。
  • 对于 i = 7,后续也没有更高温度的元素,因此输出为 0。
示例2

输入: [89, 87, 74, 91, 83]

输出: [0, 0, 1, 0, 0]

解释:

  • 对于 i = 0,后续没有更高温度的元素,所以输出为 0。
  • 对于 i = 1,后续没有更高温度的元素,因此输出为 0。
  • 对于 i = 2,后续的元素中有一个元素更高,输出为 1。
  • 对于 i = 3,后续没有更高温度的元素,因此输出为 0。
  • 对于 i = 4,后续没有更高温度的元素,因此输出为 0。
思路
方法一:暴力求解

暴力遍历数组,对于给定的元素 i,对于后续的元素 j 从 i+1 开始遍历,如果有比元素 i 更高的温度,则输出 j-i。如果整个数组都遍历结束后都没有比元素 i 更高温度的,那么输出 0。

时间复杂度:$O(n^2)$

方法二:单调栈

单调栈是一个很好的工具,在这道题目中也是非常适用的。我们沿着温度数组从左往右遍历,对于在单调栈中未被抵消的元素,我们可以保证他们在向右遍历的过程中一定还没有找到更高的温度。具体来讲,我们创建一个单调栈,从左往右遍历数组时元素入栈。对于每一个新元素,如果当前栈顶不为空,那么弹出栈顶元素,直到栈为空或者栈顶元素大于当前元素。弹出一个元素说明找到了第一个比它更高温度的元素。由于弹出后,栈顶元素已经比当前元素更低温度了,那么它就成为了当栈顶元素向右遍历时的第一个比它高温度的元素,把弹出的栈顶元素入栈。由于栈内元素肯定是递减的,那么在栈后面的元素都比栈前的元素更高温度,可以直接求得俩元素的下标差,即第 i 个元素比第 j 个元素高的差值为 j-i。

时间复杂度:$O(n)$

代码
方法一
def dailyTemperatures(T: List[int]) -> List[int]:
    res = []
    n = len(T)
    for i in range(n):
        for j in range(i + 1, n):
            if T[j] > T[i]:
                res.append(j - i)
                break
        else:
            res.append(0)
    return res
方法二
def dailyTemperatures(T: List[int]) -> List[int]:
    n = len(T)
    stack = []
    res = [0] * n
    for i in range(n):
        while stack and T[i] > T[stack[-1]]:
            j = stack.pop()
            res[j] = i - j
        stack.append(i)
    return res
总结

这道题目还是不太简单的,不过刷一些题目以后,我们也能够学会一些更好的算法方法。这里给出的方法一和方法二,在解决其他问题的时候或多或少都会使用得到。作为一名优秀的程序员,一定要对算法思路深入理解,才能在真正需要的时候快速找到解决问题的方法。