Почему время выполнения подобного решения так отличается?

Eсть проблема в LeetCode. Я использую простое рекурсивное решение для его решения, но время выполнения слишком велико, что составляет 170 мс. Потом я нашел похожее решение, что также является рекурсивным, и время выполнения этого составляет всего около 10 мс. Зачем?

Мое решение:

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;
}

};

Спасибо!

1

Решение

Ваше решение вызывает оба isBalanced а также height, всегда. Для каждого узла в дереве.

Быстрое решение вызывает treeDepth для каждого узла, но выручает рано и не вызывает isBalanced если он знает, что дерево не сбалансировано. Это оптимизация, чтобы не вызывать ненужные (рекурсивные / дорогие) функции.

3

Другие решения


По вопросам рекламы [email protected]