给定一个整数数组 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] <= 100
解法一:暴力解法
这个没什么好说的,就是循环去捞数据,捞到数据就直接跳出循环就行!
直接上代码:
public class Solution{
public int [] findTemperatures(int [] temperatures){
int length = temperatures.length;
int [] ans = new int[length];
//先做特殊条件判断
if(null == temperatures || length==0){
return ans;
}
for(int i=0;i<length;i++){
for(int j =i+1;j<length;j++){
if(temperatures[j]>temperatures[i]){
ans[i]=j-i;
break;
}
}
}
return;
}
}
这个解法简单,但是会有重复遍历的操作,时间复杂度为O(n^2)了
解法二:单调栈(只要涉及到找下一个最值的问题都可以使用单调栈来求解)
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int len = temperatures.length;
int[] ans = new int[len];
if (null == temperatures || len == 0) {
return ans;
}
Stack<Integer> stack = new Stack();
for (int i = 0; i < len; i++) {
while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
int j = stack.pop();
ans[j] = i - j;
}
stack.push(i);
}
return ans;
}
}
模板代码:
Stack s = new Stack()
for(int i =0; i<length;i++){
while(!s.isEmpty()&&temperatures[s.peek()]<temperatures[i]){
int j = s.pop();
ans[j]=i-j;
}
s.push(i);
}