java - 为什么我的代码超出了时间限制(leetcode 104)

标签 java recursion time-complexity space-complexity

我正在 leetcode 104 解决一些练习

描述:给定一棵二叉树,找到它的最大深度。 最大深度是从根节点到最远叶子节点的最长路径上的节点数。

这是我的解决方案

  public int maxDepth(TreeNode root) {
      if(root ==null ) {
         return 0 ;
      }   
      return ( maxDepth(root.left)+1) > (maxDepth(root.right)+1 ) ?
             (maxDepth(root.left)+1):(maxDepth(root.right)+1);
  }

但它抛出超过时间限制

然后我把它改成这样,它运行良好并被接受

 public int maxDepth(TreeNode root) {
          if(root ==null ) {
             return 0 ;
          }
          int left  = maxDepth(root.left)+1;
          int right = maxDepth(root.right) +1 ;
          return left > right ? left :right ; 
        }

但我不认为它们有任何区别。请帮助我了解我在哪里犯了错误。 感谢您的指导,干杯!

最佳答案

可能有四个方法调用

(maxDepth(root.left)+1) > (maxDepth(root.right)+1 ) ?
(maxDepth(root.left)+1):(maxDepth(root.right)+1)

这里您调用了 maxDepth 方法 4 次,效率很低。

root.left 和 root.right 的计算是重复的递归调用,这是不必要的。尝试通过减少方法调用的数量来思考和优化您的解决方案,这将使您的代码执行速度更快。

您的第二个代码片段仅涉及 2 个递归方法调用,使其成为性能更好的解决方案。

您甚至可以使用更简单的解决方案:

if (root == null) {
    return 0;
}
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;

关于java - 为什么我的代码超出了时间限制(leetcode 104),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50206919/

相关文章:

algorithm - 无三个连续元素的递归最大子序列和

c# - .Net 简单正则表达式二次复杂度

python - 以下代码的时间复杂度是多少? O(nlogn) 还是 O(N)?什么时候复杂度是O(nlogn)?

java - 为什么以下类型在 Java 中是可具体化和不可具体化的?

java - AAR 库似乎无法在 Android Studio 0.5.8 中工作。我究竟做错了什么?

java - 我怎样才能使这段代码最终打印一条语句来告诉是否至少有一个匹配项或文件不存在?

php - 如何使用 PHP 递归地从 MySQL 中子元素为 null 的祖先获取值

python - Python有计算空间复杂度的方法吗?

java - 支柱 2 : how to send JSON to action

java - JPA - 带有 in 子句且不区分大小写的规范