Dimple在左耳听风ARTS打卡(十八)

2019-12-27 15:01:09 浏览数 (1)

21天写作课在上周日已经结束了,21天不是结束,而是一个新的开始。所以,在往后的日子里,我还是会继续通过学到的知识,来更好地写文章。

同时,这周一开始又回到了我熟悉的节奏,会继续把之前落下的关于设计模式的系列更新完,最后几章了,坚持就是胜利。因为是参考书中的内容,所以后面有些并不会和网上部分大神写的那么详细,我会尽量做到更好,感谢大家的支持。

好啦,唠嗑结束,开启今天的打卡之旅。

Algorithm LeetCode算法

二叉树的最大深度 (https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/)

题目描述:给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例 1

给定二叉树 [3,9,20,null,null,15,7],

代码语言:javascript复制
输入:

    3
   / 
  9  20
    /  
   15   7 

输出: 

返回它的最大深度 3
代码语言:javascript复制
 

今天我们继续来看二叉树相关的题目,此次是计算二叉树的最大深度,所以做二叉树的前提,你还是需要知道二叉树是什么东西,才能更好地去理解何为深度。

首先,给出我们将要使用的树的结点TreeNode的定义,还是和上次一样,上次我没具体说明白,可能有些读者不知道如何去创建一个二叉树,在这里我补充一个简要的说明。

TreeNode 分为左结点和右结点,每个结点又可以分成N个子结点,所以左右的都是用了TreeNode对象来表示,要定义具体的值,那就用到了val数值,把你需要放入的该节点的值就好了。

比如节点根是3,那就建一个 TreeNode treeNode = new TreeNode(3); 即可,需要有左子结点,则只要treeNode.left = new TreeNode(9);即可,同理继续创建右结点,以及更多的子结点。

代码语言:javascript复制
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
      val = x;
    }
}

方法一:递归

直观的方法是通过递归来解决问题。在这里,我们用了DFS(深度优先搜索)策略的示例。具体代码如下:

代码语言:javascript复制
public class MaxDepth {
    public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(3);
        treeNode.left = new TreeNode(9);
        treeNode.right = new TreeNode(20);
        treeNode.right.left = new TreeNode(15);
        treeNode.right.right = new TreeNode(7);
        int result = maxDepth(treeNode);
        System.out.println(result);
    }

    public static int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        int result = Math.max(left, right)   1;
        return result;

    }
}

复杂度分析

  • 时间复杂度:我们每个结点只访问一次,因此时间复杂度为O(N),其中N是结点的数量。
  • 空间复杂度:在最糟糕的情况下,树是完全不平衡的,例如每个结点只剩下左子结点,递归会被调用N次(树的高度),因此保持调用栈的存储将是O(N)。但是在最好的情况下(树是完全平衡的),树的高度将是log(N)。因此,在这种情况下的空间复杂度将是O(log(N))。

方法二:迭代

我们还可以通过在栈的帮助下将上面的递归转换为迭代,具体的可以去看官方提供的答案噢,在这里就不再赘述啦。

官方地址:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/solution/er-cha-shu-de-zui-da-shen-du-by-leetcode/

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

Let’s Speed Up your Gradle Build (https://medium.com/mindorks/lets-speed-up-your-gradle-build-6c0e401883e2)

上篇文章和大家聊到我在掘金上发现的一位翻译Android文章的大佬,叫【驻坑大使】,并且翻译的文章是如何提高Android项目的构建速度。这次,我又从他的资源库里找到一篇姐妹篇,叫《让我们加快你的Gradle构建》。

文章列举了11个要点:

  1. Always use latest android Gradle Plugin
  2. If you are using command line to build ,Avoid Legacy Multidex
  3. Disable Multiple apk for developments
  4. Including Minimal Resources
  5. Disable PNG Crunching
  6. Instant RUN
  7. Use Crashlytics right
  8. Don’t use dynamic dependency version
  9. In gradle.properties file change the memory assigned for JVM according to app requirements.
  10. Enable gradle caching
  11. Multi Module Project

作为Android开发,Gradle构建确实是一大通病,每次构建一个大的项目,都需要泡杯咖啡来,所以能提高构建速度,肯定都是我们喜欢看到的结果。感谢【驻坑大叔】给我们优质的资源,让我也学习了两篇,有了更好的认识。

有条件的朋友,可以看下原文。要么就去掘金关注下【驻坑大使】,他提供的翻译,让我们的Android开发更上一层楼吧。

Tip 一个技术技巧

前几天学习了一篇架构相关的文章,来源《Android开发高手课》第34课,里面有一段话我觉得很适合我们这里的大部分人,分享给大家。

对于架构选型,康威定律是比较重要的准则,这里推荐你看看《从康威定律和技术债看研发之痛》这篇文章,我们的组织架构、代码架构以及流程都应该跟我们团队的规模相匹配。这句话怎么理解呢?就是架构设计或者架构选型不能好高骛远,我们有多大的规模,就做多少的支撑。警惕长期的事情短期做,或者短期的事情长期做。

所以,还是那句话,任何东西,适合自己的才是最好的,你们觉得呢?

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

设计模式走起来。

公众号地址: 设计模式之命令模式(一)

爱生活,爱学习,爱感悟,爱挨踢

0 人点赞