739. 每日温度

739. 每日温度

给定一个整数数组 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 <= 10^5
  • 30 <= temperatures[i] <= 100

思路:

该题目主要搞清楚,temperatures = [73,74,75,71,69,72,76,73],然后输出了[1,1,4,2,1,1,0,0],搞清楚原因,其实也很简单,就是找该数组中后面有没有比当前元素温度大的一天,如果出现了,两个的天数之差就是两者相减的结果,因此就有了第一种解法,相当简单和容易理解的解法,

解法一:

​ 创建一个新的数组,然后把传入的数组中元素进行比较,当遍历当中出现了比目标值温度更大的一天就保存两天的天数之差,跳出当前循环,进行下一个元素的遍历,最后返回这个用于保存数据的数组

java :

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int[] temp = new int[temperatures.length];
        boolean flag = false;
        // simple sort
        for(int i = 0; i < temperatures.length; i++){
            for(int j = i + 1; j < temperatures.length; j++){
                if(temperatures[i] < temperatures[j]){
                    temp[i] = j - i;
                    flag = true;
                    break;   // 不需要把所有数据都进行比较,当出现目标值时,就可以跳出这个for循环
                }
            }
            if(!flag){
                temp[i] = 0;
            }
        }
        return temp;
    }
}

解法二: 单调栈

​ 前一种解决很简单,但是时间开销太大了,O(n^2),为了节约时间开销,我们就使用一种新的方式,使用栈来做,(当然这道题本来就是有栈标签的),我们使用第一个例子来说明该算法的思想

[73,74,75,71,69,72,76,73]

第一步: 创建栈 stack,和数组 res用于存储结果 然后 先对栈进行判断 stack.isEmpty() 0:73 入栈, 0 : 是73的下标

第二步: 1 : 74 进入判断 73 < 74 (temperatures[i] > temperatures[stack.peek()]) 所以 0 : 73 出栈 同时 res[0] = 1 - 0 = 1

第三步:1 : 74 入栈

第四步:2 : 75 进入判断 74 < 75 (temperatures[i] > temperatures[stack.peek()]) 所以 1 : 74 出栈 同时 res[1] = 2 - 1 = 1

。。。。。

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        Stack<Integer> stack = new Stack<>();
        int[] res = new int[temperatures.length];
        for(int i = 0; i < temperatures.length; i++){
            while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]){
                int temp = stack.pop();
                res[temp] = i - temp;   
            }
            stack.push(i);   // 栈中存储的是下标
        }

        return res;
    }
}
posted @   十月的十日  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
主题色彩