每日温度
❤️ ❤️ 中等
题目介绍
给定一个整数数组 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 <= 105
- 30 <= temperatures[i] <= 10
分析
由题目不难得出,返回的向量answer的size等于temperature.size()
将answer初始化为0
vector<int> answer(temperature.size(),0);
-
方法一:逐个求
从后往前求
先构造一个answer,初值化为0vector answer(n,0);
往后逐个比较,answer[i]=从第i个数开始往后数的第一个比这个数大的下标-第i个数的下标
第i个数逐个与第i+1,i+2…比较,找到所求的数的下标后退出循环 -
方法二:优化方法一,
怎么优化?
假设一组 temperature=[1,9,8,7,6,5,4,3,2,1,11]
answer=[1,9,8,7,6,5,4,3,2,1,0]
按照之前的方法,当遍历到temperature[1]的时候,要和temperature[2],temperature[3],…,temperature[10]逐一比较,而9~1 在递减,这样耗费了很多不必要的时间,显然可以优化
那么,怎么优化呢?
以改组数为例,假设所求的是 temperature[3]=7对应的answer[3],要减少不必要的遍历,那么temperature[3]与temperature[4]比较,显然,7>6,answer[4]=6,那么至少到6后的第6个数才有可能比7大,遍历数的下标此时可以直接+6
代码
- 方法一:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n=temperatures.size();
vector<int> answer(n,0);
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
if(temperatures[i]<temperatures[j]){
answer[i]=j-i;break;
}
}
}
return answer;
}
};
- 方法二:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
int n=temperatures.size();
vector<int> answer(n,0);
for(int i=n-2;i>=0;i--){
for(int j=i+1;j<n;){
if(temperatures[i]<temperatures[j]){
answer[i]=j-i;break;
}else{
if(answer[j]==0){answer[i]==0;break;}
else j=j+answer[j];
}
}
}
return answer;
}
};