方法一:
核心思想:暴力枚举
思路:双重for
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int len = temperatures.length;
int[] res = new int[len];
for(int i = 0; i < len; i++){
for(int j = i + 1; j < len; j++){
if(temperatures[j] > temperatures[i]){
res[i] = j - i;
break;
}
}
}
return res;
}
}
方法二:
核心思想:单调栈
思路:
遍历整个数组,如果栈不空,且当前数字大于栈顶元素,那么如果直接入栈的话就不是 递减栈 ,所以需要取出栈顶元素,由于当前数字大于栈顶元素的数字,而且一定是第一个大于栈顶元素的数,直接求出下标差就是二者的距离。
继续看新的栈顶元素,直到当前数字小于等于栈顶元素停止,然后将数字入栈,这样就可以一直保持递减栈,且每个数字和第一个大于它的数的距离也可以算出来。
下边连接的大佬的动画完美演示了这个问题解决方式
https://leetcode.cn/problems/daily-temperatures/solution/leetcode-tu-jie-739mei-ri-wen-du-by-misterbooo/
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int len = temperatures.length;
int[] res = new int[len];
Deque<int[]> deque = new ArrayDeque<>();
for(int i = 0; i < len; i++){
if(deque.isEmpty()){
deque.offerLast(new int[]{i, temperatures[i]});
}else{
int[] tem = deque.peekLast();
while(tem[1] < temperatures[i]){
res[tem[0]] = i - tem[0];
deque.pollLast();
if(!deque.isEmpty()){
tem = deque.peekLast();
}else{
break;
}
}
deque.offerLast(new int[]{i, temperatures[i]});
}
}
while(!deque.isEmpty()){
int[] tem = deque.pollLast();
res[tem[0]] = 0;
}
return res;
}
}