Я пытаюсь решить самую длинную проблему последовательной последовательной последовательности II (LeetCode 549). Цель состоит в том, чтобы найти длину самого длинного последовательного пути (увеличивающегося или уменьшения) в двоичном дереве. Путь может идти в обоих направлениях (ребенок → родитель → ребенок), а не только вниз. Вот код, который не работает: < /p>
class Solution {
public:
int maxLen = 0;
pair toNode(TreeNode *node) {
if (!node) return {0, 0};
pair linc(0, 0), rdec(0, 0);
if (node->left) {
linc = toNode(node->left);
if (node->left->val - 1 == node->val) {
linc.second++;
}
if (node->left->val + 1 == node->val) {
linc.first++;
}
}
if (node->right) {
rdec = toNode(node->right);
if (node->right->val - 1 == node->val) {
rdec.second++;
}
if (node->right->val + 1 == node->val) {
rdec.first++;
}
}
int inc = max(1, max(linc.first, rdec.first));
int dec = max(1, max(linc.second, rdec.second));
maxLen = max(maxLen, inc + dec - 1);
return {inc, dec};
}
int longestConsecutive(TreeNode* root) {
toNode(root);
return maxLen;
}
};
< /code>
Теперь эта версия не дает правильного результата для всех тестовых случаев. Однако, когда я рефактирую его, как ниже - вычислять вкл и uc отдельно, не мутируя рекурсивные возвратные значения - он работает нормально: < /p>
class Solution {
public:
int maxLen = 0;
pair toNode(TreeNode *node){
if(!node)return {1, 1};
pairlinc(0, 0), rdec(0, 0);
int lic=0, lid=0, ric=0, rid=0;
if(node->left){
linc = toNode(node->left);
if(node->left->val == node->val-1)lid = linc.second+1;
if(node->left->val == node->val+1)lic = linc.first+1;
}
if(node->right){
rdec = toNode(node->right);
if(node->right->val == node->val-1)rid = rdec.second+1;
if(node->right->val == node->val+1)ric = rdec.first+1;
}
int inc = max(1, max(lic , ric));
int dec = max(1, max(lid, rid));
int cur = inc + dec - 1;
maxLen = max(cur, maxLen);
return {inc, dec};
}
int longestConsecutive(TreeNode* root) {
toNode(root).first;
return maxLen;
}
};
< /code>
Вопрос < /strong>
Почему первая версия стерла, даже если я увеличиваю значения пары (linc.first ++ или linc.second ++) на основе условий? Я явно не использую возвращенную пару где -либо еще, поэтому я ожидал, что эта мутация будет безопасной.[3, null, 4, null, 1, null, 2]
< /code>
ожидаемый результат: 2
my -код возвращает: 3
demo < /p>
Подробнее здесь: https://stackoverflow.com/questions/796 ... olution-in
Почему модификация возвращаемой пары из рекурсивного вызова разбивает мое решение в последовательной последовательности ⇐ C++
Программы на C++. Форум разработчиков
1751483983
Anonymous
Я пытаюсь решить самую длинную проблему последовательной последовательной последовательности II (LeetCode 549). Цель состоит в том, чтобы найти длину самого длинного последовательного пути (увеличивающегося или уменьшения) в двоичном дереве. Путь может идти в обоих направлениях (ребенок → родитель → ребенок), а не только вниз. Вот код, который не работает: < /p>
class Solution {
public:
int maxLen = 0;
pair toNode(TreeNode *node) {
if (!node) return {0, 0};
pair linc(0, 0), rdec(0, 0);
if (node->left) {
linc = toNode(node->left);
if (node->left->val - 1 == node->val) {
linc.second++;
}
if (node->left->val + 1 == node->val) {
linc.first++;
}
}
if (node->right) {
rdec = toNode(node->right);
if (node->right->val - 1 == node->val) {
rdec.second++;
}
if (node->right->val + 1 == node->val) {
rdec.first++;
}
}
int inc = max(1, max(linc.first, rdec.first));
int dec = max(1, max(linc.second, rdec.second));
maxLen = max(maxLen, inc + dec - 1);
return {inc, dec};
}
int longestConsecutive(TreeNode* root) {
toNode(root);
return maxLen;
}
};
< /code>
Теперь эта версия не дает правильного результата для всех тестовых случаев. Однако, когда я рефактирую его, как ниже - вычислять вкл и uc отдельно, не мутируя рекурсивные возвратные значения - он работает нормально: < /p>
class Solution {
public:
int maxLen = 0;
pair toNode(TreeNode *node){
if(!node)return {1, 1};
pairlinc(0, 0), rdec(0, 0);
int lic=0, lid=0, ric=0, rid=0;
if(node->left){
linc = toNode(node->left);
if(node->left->val == node->val-1)lid = linc.second+1;
if(node->left->val == node->val+1)lic = linc.first+1;
}
if(node->right){
rdec = toNode(node->right);
if(node->right->val == node->val-1)rid = rdec.second+1;
if(node->right->val == node->val+1)ric = rdec.first+1;
}
int inc = max(1, max(lic , ric));
int dec = max(1, max(lid, rid));
int cur = inc + dec - 1;
maxLen = max(cur, maxLen);
return {inc, dec};
}
int longestConsecutive(TreeNode* root) {
toNode(root).first;
return maxLen;
}
};
< /code>
Вопрос < /strong>
Почему первая версия стерла, даже если я увеличиваю значения пары (linc.first ++ или linc.second ++) на основе условий? Я явно не использую возвращенную пару где -либо еще, поэтому я ожидал, что эта мутация будет безопасной.[3, null, 4, null, 1, null, 2]
< /code>
ожидаемый результат: 2
my -код возвращает: 3
demo < /p>
Подробнее здесь: [url]https://stackoverflow.com/questions/79687018/why-does-modifying-the-returned-pair-from-a-recursive-call-break-my-solution-in[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия