java数据结构与算法刷题-----LeetCode739. 每日温度

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

在这里插入图片描述

1. 法一:单调栈

解题思路:时间复杂度O(n),空间复杂度O(n)
  1. 单调栈(递增):入栈前,先出栈比它小的所有栈顶元素。保持栈单调递增
  2. 每一个元素入栈前,如果发现它>栈顶元素,说明他就是比栈顶这个气温高的第一个气温
  1. 当 i = 0时,单调栈为空,因此将0入栈
  1. stack = [0(73)]
  2. ans = [0,0,0,0,0,0,0,0]
  1. 当 i = 1 时,由于 74 大于 73,因此移除栈顶元素 0,赋值ans[0]:= 1 - 0, 将 1 进栈。
  1. stack = [1(74)]
  2. ans = [1,0,0,0,0,0,0,0]
  1. 当 i = 2 时,由于 75 大于 74,因此移除栈顶元素 1,赋值ans[]:= 2 - 1, 将 2 进栈。
  1. stack = [2(75)]
  2. ans = [1,1,0,0,0,0,0,0]
  1. 当 i = 3 时,由于 71 小于 75,因此将 3 进栈。
  1. stack = [2(75),3(71)]
  2. ans = [1,1,0,0,0,0,0,0]
  1. 当 i = 4时,由于 69 小于 71,因此将 4 进栈。
  1. stack = [2(75),3(71),4(69)]
  2. ans = [1,1,0,0,0,0,0,0]
  1. 当 i = 5时,由于 72 大于 69 和 71,因此移除栈顶元素 4 和 3,赋值ans[4]:= 5 - 4, 和 ans[3] := 5 - 3, 将 5 进栈。
  1. stack = [2(75),5(72)]
  2. ans = [1,1,0,2,1,0,0,0]
  1. 当 i = 6 时,由于 76 大于 62 和 75,因此移除栈顶元素 5 和 2,赋值ans[5]:= 6 - 5, 和 ans[2] := 6 - 2, 将 6 进栈。
  1. stack = [6(76)]
  2. ans = [1,1,4,2,1,1,0,0]
  1. 当 i = 7时,由于 73 大于 76,因此将 7 入栈
  1. stack = [6(76), 7(73)]
  2. ans = [1,1,4,2,1,1,0,0]
代码

在这里插入图片描述

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        //单调栈,这里规定此单调栈,栈顶永远是最大的,其它元素依次递减
        int[] stack = new int[n];//空间复杂度O(n),保存各气温的   “下标”
        int[] ans = new int[n];//答案保存在这里
        int index = 0;//这是栈的栈顶指针
        //如果当前元素入栈前,发现栈顶元素比它小,那么他就是栈顶元素后面的第一个比栈顶元素高的气温
        for(int i = 0; i < n; i++){//遍历temperatures
            //如果栈不为空,并且当前i位置的气温 > 栈顶气温。就说明找到了栈顶气温的第一个比它温度高的
            while(index != 0 && temperatures[i] > temperatures[stack[index - 1]]){
                index--;//出栈
                //ans保存栈顶元素距离i位置这个比它高的气温,中间隔着几天
                ans[stack[index]] = i - stack[index];//
            }
            //每个气温入栈之前,确保栈内没有比它气温低的。
            stack[index++] = i;
        }
        return ans;
    }
}

1. 法二:双指针

解题思路:时间复杂度O( n ∗ l o g 2 n n * log_2{n} nlog2n),空间复杂度O(1)
  1. 无需额外空间,且只有在最坏情况下为O( n ∗ l o g 2 n n * log_2{n} nlog2n)时间复杂度,平均时间复杂度接近O(n)
  2. 从第二个气温开始,每个气温依次往前观察,如果前面某个气温没找到比它高的气温,那么当前气温就是前面这个气温的,第一个比它高的气温。
代码

在这里插入图片描述

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int ans[] = new int[temperatures.length];//保存答案
        for(int i = 1;i<temperatures.length;i++){//依次遍历第二个开始的每个气温
            int j = i-1;//向前遍历的指针
            while(j>=0){//如果还可以遍历
                if(ans[j]==0){//如果前面的气温,还有没有找到比它高气温的
                    if(temperatures[i]>temperatures[j]) {//看看当前气温是否比它高
                        ans[j] = i-j;//如果比它高,那么当前i指向的气温就是第一个比它高的,保存他俩相隔的天数
                    }else break;//如果当前i指向的气温比j指向的小,说明再前面的都已经找到比它大的气温了,
                }
                j--;//j前移
            }
        }
        return ans;
    }
}
  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值