每日温度之单调栈

前言

对于最近的最小最大,或是类似可转化成这种的,单调栈是一个好的贴合方法。

一、案例

在这里插入图片描述

二、题解

1)双指针暴力(这是一开始就从后往前的,跟直接暴力还是有思考的区别)
2)从后往前遍历,用一个单调栈维持后面的元素。

package com.xhu.offer.offerII;

import java.util.Stack;

//每日温度
public class DailyTemperatures {
    //刷题除了训练问题拆解的逻辑连贯性和严谨性,还可以提高积极的动脑习惯。
    public int[] dailyTemperatures(int[] temperatures) {
        //从后遍历,双指针。
        int len = temperatures.length;
        int[] res = new int[len];

        int p1 = len - 2, p2 = len - 1;
        for (; p1 >= 0; p1--) {
            if (temperatures[p1] < temperatures[p2]) {
                res[p1] = 1;
                p2 = p1;
                continue;
            }
            for (; ++p2 < len; ) {
                if (temperatures[p2] > temperatures[p1]) {
                    res[p1] = p2 - p1;
                    break;
                }
            }
            p2 = p1;
        }
        return res;
    }

    //总结:培养好积极思考的能力,一个思考方向不行就另一个思考方向,如从左开始遍历不行,就从右试试。
    public int[] dailyTemperatures2(int[] temperatures) {
        //从后遍历,双指针。
        int len = temperatures.length;
        int[] res = new int[len];
        Stack<Node> cache = new Stack<>();

        cache.push(new Node(temperatures[len - 1], len - 1));
        for (int i = len - 2; i >= 0; i--) {
            int m = cache.peek().val;
            if (m > temperatures[i]) {
                res[i] = 1;
                cache.push(new Node(temperatures[i], i));
                continue;
            }

            while (!cache.isEmpty()) {
                Node node = cache.pop();
                int val = node.val, idx = node.idx;
                if (val <= temperatures[i]) continue;
                res[i] = idx - i;
                break;
            }
            cache.push(new Node(temperatures[i], i));
        }
        return res;
    }

    public class Node {
        int val;
        int idx;

        public Node() {
        }

        public Node(int val, int idx) {
            this.val = val;
            this.idx = idx;
        }
    }
}

总结

1)刷题除了训练问题拆解的逻辑连贯性和严谨性,还可以提高积极的动脑习惯。
2)培养好积极思考的能力,一个思考方向不行就另一个思考方向,如从左开始遍历不行,就从右试试。
3)把情况分类整理好,避免多余的重复逻辑即重复代码,提高代码的质量。

参考文献

[1] LeetCode 原题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值