题目:
给定一个整数数组 temperatures
,表示每天的温度,返回一个数组 answer
,其中 answer[i]
是指对于第 i
天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0
来代替。
示例:
- 输入: t e m p e r a t u r e s = [ 73 , 74 , 75 , 71 , 69 , 72 , 76 , 73 ] temperatures = [73,74,75,71,69,72,76,73] temperatures=[73,74,75,71,69,72,76,73]
- 输出: [ 1 , 1 , 4 , 2 , 1 , 1 , 0 , 0 ] [1,1,4,2,1,1,0,0] [1,1,4,2,1,1,0,0]
解题思路一:暴力但会超时
暴力两重循环,枚举每一天之后的哪一天的温度大于当前天的温度。若有大于当前天的问题,在当前天的索引下标处记录是几天后,否则就记录0
。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> res(temperatures.size());
for(int i = 0; i < temperatures.size(); i++){
for(int j = i + 1; j < temperatures.size(); j++){
if(temperatures[j] > temperatures[i]){
res[i] = j - i;
break;
}
if(j == temperatures.size() - 1){
res[i] = 0;
}
}
}
return res;
}
};
时间复杂度
:
O
(
n
2
)
O(n^2)
O(n2)
解题思路二:单调栈
利用单调栈,栈从栈顶到栈底单调递增,栈中存放某天温度所处的下标,首先将下标0
放入栈中,然后从下标1
开始遍历。若当前元素小于等于栈顶元素,那么入栈;否则取出栈顶元素,此时栈顶元素为对应最近的大于当前遍历的温度的下标,将结果i - stk.top()
存入结果集中。结果集首先初始化为0,所以当所有元素处理完,栈中剩余元素就是没找到大于它的温度的,不做操作,默认为0。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> stk;
vector<int> res(temperatures.size(), 0);
stk.push(0);
for(int i = 1; i < temperatures.size(); i++) {
if(temperatures[i] <= temperatures[stk.top()]){
stk.push(i);
}else{
while(!stk.empty() && temperatures[i] > temperatures[stk.top()]){
res[stk.top()] = i - stk.top();
stk.pop();
}
stk.push(i);
}
}
return res;
}
};
时间复杂度
:
O
(
n
)
O(n)
O(n)