栈--[739]每日温度/medium

发布时间:2023年12月27日

1、题目

给定一个整数数组?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
Related Topics
  • 数组
  • 单调栈

2、题目分析

求当前元素后续第一个更高值的位置。
第1种方法,遍历到当前位置时,实时处理出结果,即暴力法,二层循环
第2种方法,本质是以空间换时间。遍历到当前位置时,先不处理当前位置的结果,先存起来,接着遍历。再用后续遍历到的元素和之前存起来的元素进行对比。此时如果此前存起来的元素被处理出结果,则不需要再存着。

3、解题步骤

1、遍历温度数组
2、对于每个元素,执行以下操作:

  • 如果栈为空或者当前元素小于等于栈顶元素,说明当前元素是第一个更高的温度,将当前元素的下标入栈。
  • 如果栈不为空且当前元素大于栈顶元素,说明找到了一个更高的温度,计算当前元素与栈顶元素的下标差值,并将结果存储到 answer[stack.peek()] 中。然后将栈顶元素出栈。接着对比新的栈顶元素与当前元素

4、复杂度最优解代码示例

    public static int[] dailyTemperatures(int[] temperatures) {
        Stack<Integer> stack = new Stack<>();
        int[] answer = new int[temperatures.length];
        for (int i = 0; i < temperatures.length; i++) {
            // 1、遍历温度数组

            while (stack.size() > 0 && temperatures[stack.peek()] < temperatures[i]) {
                // 2、对于每个元素,执行以下操作:
                //   - 如果栈为空或者当前元素小于等于栈顶元素,说明当前元素是第一个更高的温度,将当前元素的下标入栈。
                //   - 如果栈不为空且当前元素大于栈顶元素,说明找到了一个更高的温度,计算当前元素与栈顶元素的下标差值,并将结果存储到 answer[stack.peek()] 中。然后将栈顶元素出栈。接着对比新的栈顶元素与当前元素
                int dest = i - stack.peek();
                answer[stack.pop()] = dest;
            }
            stack.push(i);
        }
        return answer;
    }

5、抽象与扩展

什么时候用单调栈?
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。

文章来源:https://blog.csdn.net/fujuacm/article/details/135247215
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。