每日温度—leetcode739

    科技2026-10-05  1

    请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

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

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

     

    思路1:简单直观方法,暴力搜索,可惜超时

    class Solution { public: vector<int> dailyTemperatures(vector<int>& T) { int n = T.size(); vector<int> result; for(int i=0;i<n;++i){ int temp_i = i; int temp_n = 0; while(temp_i+1<n && T[i]>=T[temp_i+1]){ temp_i++; temp_n++; } if(temp_i==n-1) result.push_back(0); else result.push_back(temp_n+1); } return result; } };

    思路2:单调找 使用单调栈解这题很方便。当遇到比 以栈顶元素(表示下标)为下标的元素 还大的数,说明该天就是更高的气温,而等待的天数即为i - st.top(),随后移除栈顶元素即可;当遇到 不大于 以栈顶元素(表示下标)为下标的元素 的数,说明该天不是更高的气温,则将该元素的下标 入栈,实际上维护一个单调递减栈。

    class Solution { public: vector<int> dailyTemperatures(vector<int>& T) { int n = T.size(); stack<int> st; vector<int> ans(n,0); for(int i=0; i<n; i++) { while(!st.empty() && T[i] > T[st.top()]) { int t = st.top(); ans[t] = i - t; st.pop(); } st.push(i); } return ans; } };

     

    Processed: 0.017, SQL: 9