剑指offer 专项突破版 38、每日温度

题目链接

思路

对于扫描到的当前的温度,要从后往前看是不是比此前每天的温度要高,如果高的话就挨个通知,直到某一天的温度比他高,而且要倒着通知(为什么不正向通知?比如[36,34,33,35]),如果从前往后扫描,当前温度是最后的35,会因为36>34导致通知不到34和33,如果把通知的条件改为从前扫描到现在,那么最坏的情况下时间复杂度会变成O(n²))。如果倒着扫描,我们的局部高温会顺利地通知到它前面的温度比他低的天,基于此我们需要用栈解决问题~
因此我们的栈是一个非递增的,那么通知何时停止? 栈空或者是温度比栈顶低了
最后在通知结束后要把自己也入栈
还有一个注意点在于,因为我们需要计算天数差,所以存的是索引

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int[] highTemperatures = new int[temperatures.length];
        Stack<Integer> tempIndex = new Stack<>();

        for (int i = 0; i < temperatures.length; i++) {

            //温度比栈顶高 就修改栈顶和下方每一个温度 直到栈空或者温度小于栈顶温度
            while (!tempIndex.empty() && temperatures[i] > temperatures[tempIndex.peek()]) {
                int prev = tempIndex.pop();
                highTemperatures[prev] = i - prev;
            }
            tempIndex.push(i);
        }
        return highTemperatures;
    }
}
Go代码
func dailyTemperatures(temperatures []int) []int {
	var stack []int
	result := make([]int, len(temperatures))

	for i, temperature := range temperatures {
		for len(stack) != 0 && temperature > temperatures[stack[len(stack)-1]] {
			lowIndex := stack[len(stack)-1]
			stack = stack[0 : len(stack)-1]
			result[lowIndex] = i - lowIndex
		}
		stack = append(stack, i)
	}

	return result
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值