Skip to content

739. 每日温度

给定一个整数数组 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 <= temperatures.length <= 10^5
  • 30 <= temperatures[i] <= 100

解答

思路

  • 从右往左遍历,用单调栈存储下标,保证栈顶最小,栈底最大
  • 每次遇到比栈顶大的元素,弹出栈顶
    • 如果栈为空,说明下一个更高气温 不存在
    • 如果栈非空,说明下一个更高气温 就是栈顶

代码

C++ 代码

cpp
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        auto& t = temperatures;
        int n = t.size();

        stack<int> stk;
        vector<int> ans(n);

        for (int i = n - 1; i >= 0; i --) {
            while (stk.size() > 0 && t[stk.top()] <= t[i]) {
                stk.pop();
            }

            int res = 0;

            if (stk.size() > 0) {
                res = stk.top() - i;
            }

            stk.push(i);
            
            ans[i] = res;
        }

        return ans;
    }
};

Python 代码

python
class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        t = temperatures
        n = len(t)
        stk = []
        ans = [0] * n

        for i in range(n - 1, -1, -1):
            while len(stk) > 0 and t[stk[-1]] <= t[i]:
                stk.pop()
            
            res = 0 if len(stk) == 0 else stk[-1] - i
            ans[i] = res

            stk.append(i)
        
        return ans

Python 的特点就是 stk.pop() 是有返回值的,因此可以写为:

python
class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        t = temperatures
        n = len(t)
        stk = []
        ans = [0] * n

        for i in range(n):
            while len(stk) > 0 and t[stk[-1]] < t[i]:
                idx = stk.pop()
                ans[idx] = i - idx
            
            stk.append(i)
        
        return ans

Released under the MIT License.