【问题标题】:Why the run time of similar solution is so different?为什么类似解决方案的运行时间如此不同?
【发布时间】:2015-05-20 03:14:16
【问题描述】:

在 LeetCode 中有一个problem。我使用一个简单的递归解决方案来解决它,但是运行时间很长,为 170 毫秒。然后我找到了一个类似的solution,也是递归的,运行时间只有10ms左右。为什么?

我的解决方案:

class Solution
{
public:
    bool isBalanced(TreeNode* root)
    {
        if (root == nullptr)
            return true;

        bool left = isBalanced(root->left);
        bool right = isBalanced(root->right);

        bool curr = false;
        int sub = height(root->left) - height(root->right);
        if (sub < 2 && sub > -2)
            curr = true;

        return left && right && curr;
    }

private:
    int height(TreeNode* root)
    {
        if (root == nullptr)
            return 0;

        int leftHeight = height(root->left);
        int rightHeight = height(root->right);
        return (leftHeight > rightHeight) ? (leftHeight + 1) : (rightHeight + 1);
    }
};

我找到的快速解决方案:

class Solution {
public:
    bool isBalanced(TreeNode *root) {
        if (root==NULL) return true;

        int left = treeDepth(root->left); 
        int right = treeDepth(root->right);

        if (left-right>1 || left-right < -1) {
            return false;
        }
        return isBalanced(root->left) && isBalanced(root->right);
    }

    int treeDepth(TreeNode *root) {
        if (root==NULL){
            return 0;
        }

        int left=1, right=1;

        left += treeDepth(root->left);
        right += treeDepth(root->right);

        return left>right?left:right;
    }

};

谢谢!

【问题讨论】:

  • 这可能是尝试学习如何使用分析器的好时机。
  • 在第一个解决方案中,如果我们更改如下内容,可能会匹配 bool left = isBalanced(root->left); if(!left){ 返回 false; } bool right = isBalanced(root->right); if(!right){ 返回 false; }
  • @Cornstalks 感谢您的建议。
  • @Ravisha 谢谢。我会试试的。

标签: c++ recursion tree-balancing


【解决方案1】:

您的解决方案同时调用isBalancedheight总是。对于树中的每个节点。

更快的解决方案为每个节点调用treeDepth,但如果它知道树不平衡,则提前退出并且不调用isBalanced。不调用不必要的(递归/昂贵)函数是一种优化。

【讨论】:

  • 分析器的结果和你提到的一样。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 2020-09-28
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多