问题描述
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/daily-temperatures
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
案列
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
思路分析
暴力破解
双重循环:对每一个数的后一位开始遍历,判断是否有比他大的元素。若存在则直接终止,并且记录下当前的坐标以及相应的位置。
暴力求解:时间复杂度为O(n²)
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
// 站位排队列的感觉:后面有比今天更高的温度
// 暴力 破解
int num = temperatures.length;
int result [] = new int [num];
for(int i = 0;i<num;i++){
result[i] = 0;
for(int j = i+1;j<num;j++){
if(temperatures[j]> temperatures[i]){
result[i] = j-i;
break;
}
}
}
return result;
}
}
思路提升
时间复杂度为O(n²) :因此考虑如何去减低相应的时间复杂度。考虑到从数组的往后遍历的方式出现重复的情况。 因此思考:是否出现情况。可以将重复查找的中间的情况给记录下来,通过使用空间置换时间的方式,来降低相应的时间复杂度。
(1)使用单调栈
补充单调栈的相关知识
when 使用单调栈
对象数组是一维数组的情况下,并且要求寻找左、右侧是否存在比当前值大小的情况
what 是单调栈
使用一个额外申请的栈空间来记录下当前的值大/小的结果。
单调栈中存在是什么? 相应数的数组下标
how 效果
可以将相应的时间复杂度从暴力破解的O(n²)降低到O(n),实现了空间换时间的效果
单调栈实现的相关的业务逻辑
代码实现(未简略版)
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
//优化的方式:数据的样本足够大,因此需要考虑压缩:减少相应的规模去实现
// 不能够改变相应的次序问题 能否从后往前进行遍历 ()
int len = temperatures.length;
int result [] = new int [len];
Deque<Integer> stack = new LinkedList<>();
//单层循环遍历实现
stack.push(0);
for(int i = 1;i<len;i++){
// 比较元素与栈顶端的值大小关系
if(temperatures[i] <= temperatures[stack.peek()]){
stack.push(i);
}else{
while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()] ){
result[stack.peek()] = i -stack.peek();
stack.pop();
}
}
stack.push(i);
}
return result;
}
}
将情况进行合并(判断大小的情况) (因为无论是大、小,最后比较到栈空的情况,也是要将当前的元素存入进去)
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int len = temperatures.length;
int result [] = new int [len];
Deque<Integer> stack = new LinkedList<>();
stack.push(0);
for(int i = 1;i<len;i++){
while(!stack.isEmpty() && temperatures[i]> temperatures[stack.peek()]){
result[stack.peek()] = i- stack.peek();
stack.pop();
}
stack.push(i);
}
return result;
}
}
总结
当出现判断一维数组左右大小比较的情况,可以联想到相应的单调栈的时候,通过时间换空间的方式,来降低时间复杂度。
联系“接水滴”、“矩阵的最大面积”的实现(单调栈的思想的实现)