Java 力扣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 <= 105
30 <= temperatures[i] <= 100

本题为计算出现下一个最高温度的天数,我们只需要知道某个相对过去较高的天(下标)即可得到与之相差的天数,可以使用栈进行结果的收集。

代码如下:

	public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] ans = new int[n];
        Stack<Integer> stack = new Stack<>();
        // 从后往前遍历
        for (int i = n - 1; i >= 0; i--) {
            int current = temperatures[i];
            //当前温度大于栈顶温度 就将队尾去掉(左侧比右侧温度高,说明当前可能为峰值)
            while (!stack.isEmpty() && current >= temperatures[stack.peek()]) {
                stack.pop();
            }
            //经过上述循环处理后当前栈顶数值大于当前此时计算结果
            if (!stack.isEmpty()) {
                ans[i] = stack.peek() - i;
            }
            stack.push(i);
        }
        return ans;
    }```

正序遍历,使用栈记录出现的最高温度的数组下标,只有出现比之前出现的温度更高时进行结果的赋值并将栈中元素弹,出直到当前比历史的还要低(说明从之前到现在还没有比历史更高的温度)。
```java
	public int[] dailyTemperatures(int[] temperatures) {
        int n = temperatures.length;
        int[] ans = new int[n];
        Stack<Integer> stack = new Stack<>();
        // 正序遍历
        for (int i = 0; i < n; i++) {
            int current = temperatures[i];
            // 使用栈进行操作 只有出现栈顶记录值小于当前值时进行计算
            while (!stack.isEmpty() && current > temperatures[stack.peek()]) {
                // 出现比之前要高的温度 将记录的历史最大值弹出 
                int history = stack.pop();
                // 计算结果 此时为大于历史的最大温度 也就是过去遇到当前较大温度的天数
                ans[history] = i - history;
            }
            // 将数组元素入栈
            stack.push(i);
        }
        return ans;
    }

运行结果如下:
(含有注释效果会低,去掉注释后内存由提升)
在这里插入图片描述

在这里插入图片描述

个人见解不喜勿喷!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值