【算法通关】739. 每日温度——单调栈

298 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战


写了半天,测试调试半天,怀着紧张的心情获得一个“超出时间限制”

——leetcode此题热评

前言

大家好,我是一条,欢迎来到我的算法频道。

只做有趣的算法题,只为面试写算法

Question

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

Solution

单调栈的基本运用,栈这种数据结构用的不多,但对于解决特定问题有奇效。

栈本身是一种后进先出的数据结构,类似弹夹,只能在一端操作。

所以只需关注栈顶元素即可。

栈可以由数组、链表等实现,Java语言直接提供了栈这种数据结构。

而单调栈就是通过入栈出栈操作使栈内元素维持递增或递减的单调性,其典型问题就是寻找下一个比当前数字大或小的元素。

比如数组:[3,5,4,1],我们如何要找每一个元素下一个最小数.例如:3 下一个最小的数为1,5下一个是4.我们先构造栈,把3压入栈中,5入栈时候,发现栈顶元素3比它小,也依次压入;当4时候,栈顶元素5大于4,于是得到,5左起第一个小的元素4.将5弹出,压入4.接下来元素1,也比栈顶元素小,于是得到4第一个小的元素为1,弹出4,依次类推,3也是1...栈中的元素一直保持单调递增的状态

代码模板如下:

for (int i : nums2) {
      // 若当前栈有数据,且大于栈顶,则找到栈顶元素的下一个最大
      while (!stack.isEmpty()&&i>stack.peek()){
      // 删除栈顶元素
      stack.pop();
      }
      // 元素入栈
      stack.push(i);
}

本题难点在于计算下标的差值,所以将下标入栈。

Code

/**
 * @author 一条coding
 */
class DailyTemperatures{
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        // 返回下一个最大数的坐标与当前的差
        Stack<Integer> stack = new Stack<>();
        int[] ans = new int[temperatures.length];
        // 下一个最大数模板
        for (int i = 0; i < temperatures.length; i++) {
            while (!stack.isEmpty() && temperatures[i]>temperatures[stack.peek()]){
                Integer pop = stack.pop();
                ans[pop]=i-pop;
            }
            // 将下标入栈,就很方便的计算差值
            stack.push(i);
        }
        return ans;
    }
}

最后

点赞,点赞,还TMD是点赞!

\