LeetCode 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.暴力
解题思路
这道题如果用暴力解,就是循环两次,外循环遍历所有温度,外循环遍历后面的温度,依次找到每一天温度的结果。这种做法如果遇到温度都是递增的情况,最坏时间复杂度为O(N^2)。这种方法案例是跑不通的。
class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {vector<int> ans;int n = temperatures.size();for(int i = 0;i < n;i ++){int j = i;while(j < n && temperatures[j] <= temperatures[i]) j ++;if(j == n) j = i;ans.push_back(j - i);}return ans;}
};时间复杂度O(N^2),空间复杂度O(1)
2.栈
解题思路:
我们尝试空间换时间方式来进行优化,利用栈保存"未找到更高温度"的索引,遇到高温时一次性解决多个等待问题,这样就了避免重复比较,每个元素最多入栈一次、出栈一次,虽然内层有while循环,但总操作次数是2n次。详细步骤请看代码注释。
class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n = temperatures.size(); vector<int> ans(n, 0); // 初始化结果数组,默认值为0(表示没有更高温度)stack<pair<int, int>> s; // 单调栈:存储(温度值, 索引)对// 将第一个元素压入栈中s.push({temperatures[0], 0});// 从第二个元素开始遍历for(int i = 1; i < n; i++) {// 当前温度比栈顶温度高时,弹出栈顶并计算等待天数while(!s.empty() && temperatures[i] > s.top().first) {// 栈顶元素找到了更高的温度,计算等待天数ans[s.top().second] = i - s.top().second;s.pop(); // 弹出已处理的元素}// 将当前温度压入栈中,等待后续更高的温度s.push({temperatures[i], i});}// 栈中剩余的元素自动保持ans[i] = 0(没有更高温度)return ans;}
};时间复杂度O(N),空间复杂度O(N)
