2018 12 29 ARTS(11)

68 篇文章 0 订阅
49 篇文章 0 订阅

什么是 ARTS
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Tech:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章;

Algorithm 算法题

739 每日温度

https://leetcode-cn.com/problems/daily-temperatures/submissions/
不做不知道,一做吓一跳,查了资料才知道,原来这题是单调栈的经典题目啊。这道题是单调栈的经典例题,而且单调栈其实算是算法中的中等偏上级别的应用了。做完这题其实我发现,用栈的难度在于,你需要变化你的思想,原来我们做题,答案总是一个一个找的,一个答案找完然后下一个,但是如果是栈,那么这个答案就不是马上就来,也许是在很多答案出来之后。 有了这个觉悟,那么可能熟练度就会高一些了。
这个题目简单来说就是,给你一个数组,你要去记下一个数X,这个X就代表:你往左走X步可以遇到比你大的数,如果你没遇到比你大的数,那么就不用管了。嗯,其实题目简单来说就是这种意思。
那么如果咱们用一个常规的解法,遍历数组,每次遇到一个数然后就停下来,根据这个数再去遍历一次数组找比这个数还大的数,那么时间复杂度肯定很高的。如果遇到最坏的情况,这个数组是单调递减的,那么每次遇到一个数就要遍历到数组的最后,那么时间复杂度搞到O(n^2)。其实按照我的刷题的经验,这种一般都不会通过的。
那么就需要寻找一种起码可以说的过去的答案。
因为之前没有做过这种题目,只好上网找答案。这才知道了一种叫做的单调栈 的栈的应用方法。
这种栈一般是两种:

  • 1)单调递增栈;
  • 2)单调递减栈
    其实简单点就是,从栈顶到栈底的元素要么是单调递增,要么是单调递减的。比如咱们要维护一个单调递减栈,那么要保证每次压入栈的元素都比栈里面的剩下的元素大,那么就需要把比你大的元素弹出,然后再压入栈。
    比如现在我么有个数组:

[71,73,71,69,67,63,60]


我们需要维护的栈是那个坐标栈,作为的坐标栈,就是表示,在栈里面值都是数组中的坐标值;而元素栈里面的值是坐标对应的元素的值。这个结合题目来看就很能明白了。那么当什么时候我们需要把元素弹出,什么时候把元素压入呢?

  • (1) 当压入的坐标栈的坐标对应的元素大于栈顶的坐标对应的元素的时候,那么把栈顶的坐标弹出,把这个坐标和新的栈顶的坐标进行继续比较。
  • (2) 当栈里面的坐标对应的元素都比这个元素来的大的时候,把这个元素压入栈。
    咱们先来看代码,看完代码再来说为啥子要这么做。
class Solution {
    public int[] dailyTemperatures(int[] T) {
        Stack<Integer> stack = new Stack<Integer>();
        int length = T.length;
        int[] resultArray = new int[length];
        for (int i = 0; i < length; i++) {
            while (!stack.isEmpty() && T[stack.peek()] < T[i]) {
                int top = stack.pop();
                resultArray[top] = i - top;   
            }
            stack.push(i);
        }
        return resultArray;
    }
}

首先题目说了,我们要往左边找,看看需要移动几步才能找到比当前元素大的元素,那么我们先把数组的元素对应的坐标压入栈中,如果下一个元素大于这个压入栈的中的元素的话,那么就说明我们找到了这个大于当前坐标的元素了,那么我们只要把元素弹出,那么需要移动几步呢?就是把两个坐标相减,就得出答案了 (i - top) 。当然最重要的条件是 (T[stack.peek()] < T[i] )

Review 阅读并点评至少一篇英文技术文章

How to write Clean Code?
如果看过了代码简洁之道的就基本不用看这篇文章了,因为这里就是对文章内容的一次浓缩。
作者重点说了关于命名的一些规则,比如,方法最好使用动词,普通的变量的名称最好不要用缩写等等,其实我简略的看了一下,说道详细其实还不如阿里巴巴出的《码出高效》,这篇文章让我有了重读一遍这本书的冲动。

Tip/Tech:学习至少一个技术技巧

关于使用链表的一些技巧。

Share:分享一篇有观点和思考的技术文章

10 tips to Improve Java Programming Skills in 2019
分享这篇,主要是觉得,这些面向初学者的文章是永不过时的。感觉很多产品都是这样一路走来的。这样其实挺好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值