问题在于: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)快?
答案 0 :(得分:2)
Big-O表示法不会告诉您有关N的特定值的运行时间,它只会告诉您随着N的增加,运行时间增长。
对于特定的N,O(n)的表现优于O(n ^ 2)并非不自然。
考虑到这一点,总是需要10分钟才能完成的代码是O(1)。