题意:
根据往后 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; } };
时间复杂度:空间复杂度: