题意:
根据往后 n 天的天气预报,计算每一天需要等待几天才会出现一次更高的气温,如果往后都没有更高的气温,则用 0 补位。
例如往后三天的气温是 [1,2,3] , 则输出 [1,1,0]。
方法一:
单调栈
思路:题意核心:以当前值为例,找出右边第一个比当前值大的数,并计算出两者的距离。(明显的单调栈题型)
1.因为要找出之前的数要比当前值大,而之前的数又是右边的数,因此要从右往左遍历数组;
2.因为要计算两者相差的距离,所以初始化栈,栈存储数的下标;
3.逆向遍历数组,如果栈非空并且栈顶元素<=当前遍历的值,则弹栈;4.最后,反转答案数组。
class Solution {
public:
vector<int> temperatures(vector<int>& dailyTemperatures) {
int n=dailyTemperatures.size();
stack<int> st;//初始化栈,存储值的下标
vector<int> res;
for(int i=n-1;i>=0;i--){//逆序遍历
//如果栈非空并且栈顶元素<=当前遍历的值,则弹栈
while(!st.empty()&&dailyTemperatures[st.top()]<=dailyTemperatures[i]){
st.pop();
}
res.push_back(st.empty()?0:st.top()-i);//计算相差的距离
st.push(i);//下标入栈
}
reverse(res.begin(),res.end());//反转答案数组
return res;
}
};
时间复杂度:
空间复杂度:![]()
方法二:
暴力
思路:二重循环遍历数组。
外层循环以每个数作为基准,内层循环遍历数组寻找右边比当前值大的数。如果找得到,则计算两者下标之差;否则,添加0。
class Solution {
public:
vector<int> temperatures(vector<int>& dailyTemperatures) {
int n=dailyTemperatures.size();
vector<int> res;
int flag;
for(int i=0;i<n;i++){
flag=0;
for(int j=i+1;j<n;j++){
if(dailyTemperatures[i]<dailyTemperatures[j]){//寻找右边比当前值大的数
res.push_back(j-i);//计算下标之差
flag=1;
break;
}
}
if(flag==0){//右边没有比当前值大的数,添加0
res.push_back(0);
}
}
return res;
}
};
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号