Leetcode:平衡二叉树。我的程序是O(n ^ 2)?它的运行速度比O(n)快

时间:2014-12-07 16:47:05

标签: algorithm

问题在于:https://oj.leetcode.com/problems/balanced-binary-tree/ 首先我写出解决方案,我认为这是O(n ^ 2):

class Solution {
public:
    int calc(TreeNode *p){
        if (p==NULL) return 0;
        int a=calc(p->left);
        int b=calc(p->right);
        if (a>b) return a+1; else return b+1;
    }
    bool isBalanced(TreeNode *root) {
        if (root==NULL) return true;
        return (isBalanced(root->left) && isBalanced(root->right) && abs(calc(root->left)-calc(root->right))<=1);

    }
};

然后我写了一个O(n)解决方案: class Solution {

public:
    int check(TreeNode *p){
        if (p==NULL) return 0;
        int l=check(p->left);
        int r=check(p->right);
        if( l==-99 || r==-99 || abs(l-r)>1) return -99;
        return max(l,r)+1;
    }
    bool isBalanced(TreeNode *root) {
        if (root==NULL) return true;
        return check(root)!=-99;

    }
};

两人都接受了。第一个运行时间:56毫秒,第二个是100毫秒,有时是400 +毫秒。 为什么O(n ^ 2)如果比O(n)快?

1 个答案:

答案 0 :(得分:2)

Big-O表示法不会告诉您有关N的特定值的运行时间,它只会告诉您随着N的增加,运行时间增长

对于特定的N,O(n)的表现优于O(n ^ 2)并非不自然。

考虑到这一点,总是需要10分钟才能完成的代码是O(1)。