【LeetCode】739, 每日温度。 难度等级:中等。多种解法,值得研究。

0. 题目

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例1:

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

示例2:

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例3:

输入: temperatures = [30,60,90]
输出: [1,1,0]

1. 暴露搜索:O(n2) 超过时间限制

最简单的方法是暴力搜索,其时间复杂度是 O(n2) ,在个别执行用例时会超出时间限制。代码如下:

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        length=len(temperatures)
        ans=[0]*length
        for i in range(length-1):
            if temperatures[i+1]>temperatures[i]:
                ans[i]=1
            else:
                for j in range(i+1,length):
                    if temperatures[j]>temperatures[i]:
                        ans[i]=j-i
                        break
        return ans

2. 精妙解法:逆向搜索,单层循环 O(n)

前向搜索的问题是需要二次循环,导致时间复杂度较高。

如果考虑逆向搜索,那么可以在 O(1) 时间复杂度内找到下一个气温更高的天气。该方法堪称绝妙,代码如下:

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        length = len(temperatures)
        ans= [0] * length
        # 必须逆序
        for i in range(length - 2, -1, -1):
            pos=i+1
            # 只要前一天温度比现在的高
            while temperatures[pos] <= temperatures[i]:
                # 找到下一个比 temperatures[pos] 气温高的天气,与temperatures[i]进行比较
                if ans[pos] > 0:
                    pos += ans[pos]
                # 找不到下一个比 temperatures[pos] 气温高的天气,因为也没有比 temperatures[i] 气温高的天气,所以 ans[i] = 0
                else:
                    pos=i
                    break
            # 找到比i天的温度高的位置,计算结果存储即可
            ans[i] = pos - i
        return ans

3. 官方解法:单调栈,单层循环 O(n)

单调栈 LeetCode 官方视频讲解:每日温度

思路:维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。

code:

class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        stack=[]
        length=len(temperatures)
        ans=[0]*length

        for i in range(length):
            if not stack:
                stack.append([i,temperatures[i]])
            else:
                while stack and temperatures[i]>stack[-1][1]:
                    ans[stack[-1][0]]=i-stack[-1][0]
                    stack.pop()
                stack.append([i,temperatures[i]])
        return ans

猜你喜欢

转载自blog.csdn.net/qq_43799400/article/details/131713370