栈的应用:每日温度

题目描述:

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

题目解析:

对于输入 73,它需要 经过一天 才能等到温度的升高,也就是在第二天的时候,温度升高到 74 ,所以对应的结果是 1。

对于输入 74,它需要 经过一天葡京在线网投 才能等到温度的升高,也就是在第三天的时候,温度升高到 75 ,所以对应的结果是 1。

对于输入 75,它经过 1 天后发现温度是 71,没有超过它,继续等,一直 等了四天,在第七天才等到温度的升高,温度升高到 76 ,所以对应的结果是 4 。

对于输入 71,它经过 1 天后发现温度是 69,没有超过它,继续等,一直 等了两天,在第六天才等到温度的升高,温度升高到 72 ,所以对应的结果是 2 。

对于输入 69,它 经过一天葡京在线网投 后发现温度是 72,已经超过它,所以对应的结果是 1 。

对于输入 72,它 经过一天葡京在线网投 后发现温度是 76,已经超过它,所以对应的结果是 1 。

对于输入 76,后续 没有温度葡京在线网投 可以超过它,所以对应的结果是 0 。

对于输入 73,后续 没有温度 可以超过它,所以对应的结果是 0 。

具体代码如下:

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

def daily_temp(tem):
    # 模拟一个递减栈,存放当天的索引
    stack = []
    # 结果列表,几天后气温才升高
    res = [0] * len(tem)
    # 循环整个列表
    for i in range(len(tem)):
        # 当栈不为空且当前天数的气温大于栈顶的气温时,计算栈顶那天过几天气温才会升高
        while stack and tem[i] > tem[stack[-1]]:
            res[stack[-1]] = i - stack[-1]
            # 计算完出栈
            stack.pop()
        # 栈为空或者没有超过的温度,入栈一个
        stack.append(i)

    return res

if __name__ == '__main__':
    print(daily_temp(t))

posted @ 2020-03-11 13:43  MilesMa  阅读(...)  评论(...)    收藏