ru
Feedback
C/C++ | LeetCode

C/C++ | LeetCode

Открыть в Telegram
3 256
Подписчики
+124 часа
+17 дней
-830 день
Архив постов
Распродажа на Stepik. Соберите все скидки весны! Stepik объявляет масштабную весеннюю распродажу.⚡ Она пройдет с 20 мая по 2 июня 2025 года и распространяется на курсы по программированию, аналитике, маркетингу, дизайну, иностранным языкам и пр. Это отличная возможность, если вы хотите: — Освоить новую профессию, например начать погружение в мир IT — Научиться играть на музыкальном инструменте, писать книги или стать увереннее в публичных выступлениях — Освоить новую технологию или инструмент, например работу с ИИ Не пропустите главное событие первой половины 2025 года на Stepik: переходите в наш уютный каталог найдите свой курс😊 Купить #реклама 16+ stepik.org О рекламодателе

Задача: 979. Distribute Coins in Binary Tree Сложность: medium Вам дан корень бинарного дерева с n узлами, где каждый узел в дереве содержит node.val монет. Всего по всему дереву распределено n монет. За один ход мы можем выбрать два смежных узла и переместить одну монету из одного узла в другой. Ход может быть как от родителя к ребенку, так и от ребенка к родителю. Верните минимальное количество ходов, необходимых для того, чтобы каждый узел имел ровно одну монету. Пример:
Input: root = [3,0,0]
Output: 2
Explanation: From the root of the tree, we move one coin to its left child, and one coin to its right child.
👨‍💻 Алгоритм: 1⃣Инициализация и определение рекурсивной функции. Инициализируйте переменную moves = 0. Определите рекурсивную функцию dfs, которая считает количество перемещений монет. Базовый случай: если текущий узел равен null, верните 0. 2⃣Рекурсивный обход дерева. Внутри dfs вызовите dfs для левого и правого поддеревьев, чтобы получить количество монет, которые нужно переместить в каждом поддереве. Вычислите количество перемещений для текущего узла: добавьте абсолютные значения перемещаемых монет в moves. 3⃣Возвращение результата. Верните количество монет, которые текущий узел может передать своему родителю: значение узла плюс количество монет в левом и правом поддеревьях минус 1. Вызовите dfs от корня дерева и верните moves. 😎 Решение:
class Solution {
public:
    int distributeCoins(TreeNode* root) {
        moves = 0;
        dfs(root);
        return moves;
    }

private:
    int moves;

    int dfs(TreeNode* current) {
        if (current == nullptr) return 0;
        int leftCoins = dfs(current->left);
        int rightCoins = dfs(current->right);
        moves += abs(leftCoins) + abs(rightCoins);
        return current->val - 1 + leftCoins + rightCoins;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Крупнейший университет искусственного интеллекта Приглашаем на бесплатный курс по искусственному интеллекту! 5 занятий по тем
Крупнейший университет искусственного интеллекта Приглашаем на бесплатный курс по искусственному интеллекту! 5 занятий по теме «Промпт-инжиниринг». Регистрируйся для получения полного бесплатного доступа к курсу. ✨ 8 000+ студентов со всего мира ✨ 600+ AI-проектов, созданных студентами ✨ Сборная Университета — победители крупнейших AI-хакатонов России ✨ Стажировки в крупнейших компаниях России (РЖД, Ростелеком, РУДН, Совкомбанк, Самолет и другие) ✨ Трудоустраиваем выпускников в крупнейшие компании (Яндекс, ВТБ, Сбербанк, Роскосмос и другие) Будем рады видеть тебя в наших рядах! Узнать больше #реклама 16+ neural-university.ru О рекламодателе

Задача: 734. Sentence Similarity Сложность: easy Мы можем представить предложение в виде массива слов, например, предложение "I am happy with leetcode" можно представить как arr = ["I", "am",happy", "with", "leetcode"]. Даны два предложения sentence1 и sentence2, каждое из которых представлено в виде массива строк, и массив пар строк similarPairs, где similarPairs[i] = [xi, yi] указывает, что два слова xi и yi похожи. Возвращается true, если предложения sentence1 и sentence2 похожи, или false, если они не похожи. Два предложения похожи, если: у них одинаковая длина (т.е, Заметьте, что слово всегда похоже само на себя, также обратите внимание, что отношение сходства не является транзитивным. Например, если слова a и b похожи, а слова b и c похожи, то a и c не обязательно похожи. Пример:
Input: sentence1 = ["great","acting","skills"], sentence2 = ["fine","drama","talent"], similarPairs = [["great","fine"],["drama","acting"],["skills","talent"]]
Output: true
👨‍💻 Алгоритм: 1⃣Проверьте, равны ли длины предложений sentence1 и sentence2. Если нет, верните false. 2⃣Создайте словарь для хранения всех пар похожих слов. 3⃣Проверьте каждую пару слов из предложений sentence1 и sentence2 на схожесть, используя словарь и правило, что слово всегда похоже на само себя. 😎 Решение:
class Solution {
public:
    bool areSentencesSimilar(vector<string>& sentence1, vector<string>& sentence2, vector<vector<string>>& similarPairs) {
        if (sentence1.size() != sentence2.size()) {
            return false;
        }

        unordered_map<string, unordered_set<string>> similar;
        for (const auto& pair : similarPairs) {
            similar[pair[0]].insert(pair[1]);
            similar[pair[1]].insert(pair[0]);
        }

        for (int i = 0; i < sentence1.size(); ++i) {
            const string& w1 = sentence1[i];
            const string& w2 = sentence2[i];
            if (w1 != w2 && (similar[w1].find(w2) == similar[w1].end())) {
                return false;
            }
        }

        return true;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Курс «Бизнес-аналитик» - поможем с трудоустройством! Освойте высокооплачиваемую IT-профессию с нуля за 7 месяцев. Выдаём дипл
Курс «Бизнес-аналитик» - поможем с трудоустройством! Освойте высокооплачиваемую IT-профессию с нуля за 7 месяцев. Выдаём диплом, помогаем с трудоустройством. Excel, SQL, PowerBI, Python, BPMN, UML, EPC, IDEF. Преимущества обучения в Академии Eduson: 🎓 официальный государственный диплом 🎓 рассрочка 0% на 24 мес. 🎓 22 реальных бизнес-кейса 🎓 бессрочный доступ к лекциям и материалам, которые регулярно обновляются 🎓 личный куратор с Вами на связи Начните обучаться онлайн и получать стабильный доход уже во время обучения! Получить консультацию #реклама 16+ eduson.academy О рекламодателе

Задача: 1273. Delete Tree Nodes Сложность: medium Дерево, укорененное в узле 0, задано следующим образом: количество узлов - nodes; значение i-го узла - value[i]; родитель i-го узла - parent[i]. Удалите все поддеревья, сумма значений узлов которых равна нулю. Верните количество оставшихся узлов в дереве. Пример:
Input: nodes = 7, parent = [-1,0,0,1,2,2,2], value = [1,-2,4,0,-2,-1,-1]
Output: 2
👨‍💻 Алгоритм: 1⃣Постройте дерево из заданных узлов, значений и родителей. 2⃣Используйте постфиксный обход для вычисления суммы значений в каждом поддереве и помечайте узлы для удаления, если их сумма равна нулю. 3⃣Удалите отмеченные узлы и их поддеревья и верните количество оставшихся узлов. 😎 Решение:
class Solution {
public:
    int deleteTreeNodes(int nodes, vector<int>& parent, vector<int>& value) {
        unordered_map<int, vector<int>> tree;
        for (int i = 0; i < nodes; ++i) {
            tree[parent[i]].push_back(i);
        }

        return dfs(0, tree, value).second;
    }

private:
    pair<int, int> dfs(int node, unordered_map<int, vector<int>>& tree, vector<int>& value) {
        int totalSum = value[node];
        int totalCount = 1;
        for (int child : tree[node]) {
            auto [childSum, childCount] = dfs(child, tree, value);
            totalSum += childSum;
            totalCount += childCount;
        }
        if (totalSum == 0) {
            return {0, 0};
        }
        return {totalSum, totalCount};
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Repost from Backend
Привет ребят! Мне в последнее время пишет очень много начинающих предпринимателей оценить их бизнес со стороны. Я как человек с 10 годами опыта в создании стартапов, как успеших так и абсолютно убыточных могу дать свою оценку. Я продавал свой бизнес в прибыль, и я также в убыток продовал несколько своих проектов. Готов с вами обсудить ваши идеи, но только сейчас, пока я пьян и на веселе. Напишите @kivaiko и мы созвонимся, чтобы я трезво оценивал ваши шансы и дал экспертные рекомендации.

Онлайн-магистратура "Науки о данных". Ваш рост в IT! ✅ТОП-1 тех.вуз РФ ✅Диплом магистра ✅Карьера в топ-компаниях ✅Запуск стар
Онлайн-магистратура "Науки о данных". Ваш рост в IT! ✅ТОП-1 тех.вуз РФ ✅Диплом магистра ✅Карьера в топ-компаниях ✅Запуск стартапа ✅+2 диплома ДПО Data Science, МФТИ — среда для профессионального и карьерного роста в IT! Записаться онлайн #реклама 16+ mipt.online О рекламодателе

Задача: 34. Find First and Last Position of Element in Sorted Array Сложность: medium Учитывая отсортированный по не убыванию массив целых чисел nums, необходимо найти начальную и конечную позиции заданного значения target. Если значение не найдено, вернуть [-1, -1]. Алгоритм должен работать за O(log n). Пример:
Input: nums = [5,7,7,8,8,10], target = 8 Output: [3,4]
👨‍💻 Алгоритм: 1⃣Используем lower_bound для нахождения первого вхождения target. 2⃣Используем upper_bound для нахождения позиции после последнего вхождения target. 3⃣Если target найден, заполняем результат позициями начала и конца. 😎 Решение:
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> ans{-1,-1};
        auto l = lower_bound(nums.begin(), nums.end(), target);
        auto r = upper_bound(nums.begin(), nums.end(), target);
        if (l != nums.end() && *l == target) {
            ans[0] = l - nums.begin();
            ans[1] = r - nums.begin() - 1;
        }
        return ans;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

PostgreSQL как сервис: что это и как применяется? Сервис PostgreSQL от РТК-ЦОД позволяет быстро развернуть, эксплуатировать и
PostgreSQL как сервис: что это и как применяется? Сервис PostgreSQL от РТК-ЦОД позволяет быстро развернуть, эксплуатировать и масштабировать базу данных в облаке. Процесс установки и настройки полностью автоматизирован. Как наши клиенты используют PostgreSQL? — Работают в 1С — Управляют платежными системами — Ведут финансовый учет — Собирают геоданные — Работают с данными со сложной структурой — Анализируют большие массивы данных ✅30 дней бесплатно: тестируйте наш сервис с полным доступом ко всем возможностям. Оставьте заявку на www.cloud.rt.ru Узнать больше #реклама 16+ cloud.rt.ru О рекламодателе

Задача: 85. Maximal Rectangle Сложность: hard Дана бинарная матрица размера rows x cols, заполненная '0' и '1'. Найдите наибо
Задача: 85. Maximal Rectangle Сложность: hard Дана бинарная матрица размера rows x cols, заполненная '0' и '1'. Найдите наибольший прямоугольник, содержащий только '1', и верните его площадь. Пример:
Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
Output: 6
👨‍💻 Алгоритм: 1⃣Для каждой строки i считаем количество подряд идущих '1' слева от текущей ячейки, т.е. если matrix[i][j] == '1', то dp[i][j] = dp[i][j-1] + 1 (иначе 0). 2⃣Для каждой единицы на позиции (i,j) идём вверх по столбцу, накапливая минимальную ширину width, и вычисляем площадь текущего прямоугольника width * высота, обновляя максимум. 3⃣Повторяем для всех ячеек, возвращаем наибольшую найденную площадь. 😎 Решение:
class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if (matrix.size() == 0) return 0;
        int maxarea = 0;
        vector<vector<int>> dp(matrix.size(), vector<int>(matrix[0].size(), 0));

        for (int i = 0; i < matrix.size(); i++) {
            for (int j = 0; j < matrix[0].size(); j++) {
                if (matrix[i][j] == '1') {
                    dp[i][j] = j == 0 ? 1 : dp[i][j - 1] + 1;
                    int width = dp[i][j];
                    for (int k = i; k >= 0; k--) {
                        width = std::min(width, dp[k][j]);
                        maxarea = std::max(maxarea, width * (i - k + 1));
                    }
                }
            }
        }
        return maxarea;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

ПСК 5,046% - 29,191%. Ипотека от 5% для всех! Это не семейная программа. А комфортная ставка, которой могут воспользоваться д
ПСК 5,046% - 29,191%. Ипотека от 5% для всех! Это не семейная программа. А комфортная ставка, которой могут воспользоваться даже пары без детей или холостяки. И оформить квартиру от 16 200 руб/мес в ЖК «Мотивы». Если не хочется переплачивать даже за ипотеку под 5%, выберите один из вариантов беспроцентной рассрочки: 1. С первым платежом от 260 000 ₽ на двух- или трехкомнатную квартиру. 2. Длительная рассрочка на год! Оставьте заявку на сайте, чтобы узнать подробности и получить планировки. Перейти на сайт Изучите все условия кредита (займа) на сайте в соответствующем разделе. Оценивайте свои финансовые возможности и рискиПроектная декларация на сайте https://наш.дом.рф/. Застройщик: ООО "СЗ "ИСБ Девелопмент". Финансовые услуги оказывает: ПАО Сбербанк. #реклама zhk-motivy.rqch.ru О рекламодателе

Задача: 330. Patching Array Сложность: hard Дан отсортированный массив целых чисел nums и целое число n. Добавьте/дополните элементы в массив таким образом, чтобы любое число в диапазоне [1, n] включительно могло быть сформировано как сумма некоторых элементов массива. Верните минимальное количество дополнений, необходимых для этого. Пример:
Input: nums = [1,3], n = 6
Output: 1
Explanation:
Combinations of nums are [1], [3], [1,3], which form possible sums of: 1, 3, 4.
Now if we add/patch 2 to nums, the combinations are: [1], [2], [3], [1,3], [2,3], [1,2,3].
Possible sums are 1, 2, 3, 4, 5, 6, which now covers the range [1, 6].
So we only need 1 patch.
👨‍💻 Алгоритм: 1⃣Инициализация переменных: Создайте переменную miss, представляющую наименьшее пропущенное число, которое еще не покрыто, и установите ее значение на 1. Создайте переменную patches для подсчета необходимых дополнений и переменную i для итерации по массиву nums. 2⃣Основной цикл: Используйте цикл while, который будет выполняться до тех пор, пока miss не станет больше n. Внутри цикла проверьте, покрывает ли текущий элемент nums[i] значение miss. Если да, добавьте nums[i] к miss и увеличьте i. Если нет, добавьте значение miss к самому себе (это означает добавление нового элемента в массив) и увеличьте счетчик patches. 3⃣Возврат результата: После завершения цикла верните значение patches, которое представляет минимальное количество необходимых дополнений. 😎 Решение:
class Solution {
public:
    int minPatches(vector<int>& nums, int n) {
        int patches = 0, i = 0;
        long miss = 1;
        while (miss <= n) {
            if (i < nums.size() && nums[i] <= miss) {
                miss += nums[i++];
            } else {
                miss += miss;
                patches++;
            }
        }
        return patches;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Высшее образование дистанционно в Московском ВУЗе Вы мечтаете получить высшее образование, но не сдали ЕГЭ или получили низки
Высшее образование дистанционно в Московском ВУЗе Вы мечтаете получить высшее образование, но не сдали ЕГЭ или получили низкие баллы? У нас есть решение для вас! Институт Международных Экономических Связей предлагает дистанционное обучение , которое позволяет получать качественные знания из любой точки мира по 10+ направлениям обучения. ✅ Государственный диплом без отметки о дистантеУдобный личный кабинет студентаПоддержка кураторов на каждом этапе обученияМожно поступить без ЕГЭ Узнать больше #реклама 16+ imes.su О рекламодателе

Задача: 1473. Paint House III Сложность: hard Есть ряд из m домов в маленьком городе, каждый дом должен быть покрашен одним из n цветов (обозначены от 1 до n), некоторые дома, которые были покрашены прошлым летом, не должны быть перекрашены. Соседство — это максимальная группа непрерывных домов, которые покрашены в один и тот же цвет. Например: дома = [1,2,2,3,3,2,1,1] содержат 5 соседств [{1}, {2,2}, {3,3}, {2}, {1,1}]. Дан массив домов, матрица m x n стоимости и целое число target, где: houses[i]: цвет дома i, и 0, если дом ещё не покрашен. cost[i][j]: стоимость покраски дома i в цвет j + 1. Верните минимальную стоимость покраски всех оставшихся домов таким образом, чтобы было ровно target соседств. Если это невозможно, верните -1. Пример:
Input: houses = [0,0,0,0,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3
Output: 9
Explanation: Paint houses of this way [1,2,2,1,1]
This array contains target = 3 neighborhoods, [{1}, {2,2}, {1,1}].
Cost of paint all houses (1 + 1 + 1 + 1 + 5) = 9.
👨‍💻 Алгоритм: 1⃣Инициализация и базовые случаи: Создайте класс Solution и массив memo для мемоизации результатов. Установите MAX_COST как максимально возможную стоимость плюс 1. Создайте метод findMinCost, который проверяет базовые случаи: - если все дома пройдены, возвращайте 0, если количество соседств равно target, иначе возвращайте MAX_COST. - если количество соседств больше target, возвращайте MAX_COST. Если результат уже вычислен, возвращайте его из memo. 2⃣Рекурсивное вычисление минимальной стоимости: Если дом уже покрашен, обновите количество соседств и вызовите рекурсивный метод для следующего дома. Если дом не покрашен, попробуйте покрасить его в каждый возможный цвет, обновите количество соседств и вызовите рекурсивный метод для следующего дома. Храните минимальную стоимость. 3⃣Метод minCost: Запустите метод findMinCost с начальными параметрами и верните результат. Если результат равен MAX_COST, верните -1. 😎 Решение:
class Solution {
public:
    int memo[100][100][21];
    const int MAX_COST = 1000001;
    
    int findMinCost(vector<int>& houses, vector<vector<int>>& cost, int targetCount, int currIndex, int neighborhoodCount, int prevHouseColor) {
        if (currIndex == houses.size()) {
            return neighborhoodCount == targetCount ? 0 : MAX_COST;
        }
        
        if (neighborhoodCount > targetCount) {
            return MAX_COST;
        }
        
        if (memo[currIndex][neighborhoodCount][prevHouseColor] != -1) {
            return memo[currIndex][neighborhoodCount][prevHouseColor];
        }
        
        int minCost = MAX_COST;

        if (houses[currIndex] != 0) {
            int newNeighborhoodCount = neighborhoodCount + (houses[currIndex] != prevHouseColor ? 1 : 0);
            minCost = findMinCost(houses, cost, targetCount, currIndex + 1, newNeighborhoodCount, houses[currIndex]);
        } else {
            int totalColors = cost[0].size();
            for (int color = 1; color <= totalColors; ++color) {
                int newNeighborhoodCount = neighborhoodCount + (color != prevHouseColor ? 1 : 0);
                int currCost = cost[currIndex][color - 1] + findMinCost(houses, cost, targetCount, currIndex + 1, newNeighborhoodCount, color);
                minCost = min(minCost, currCost);
            }
        }
        
        return memo[currIndex][neighborhoodCount][prevHouseColor] = minCost;
    }
    
    int minCost(vector<int>& houses, vector<vector<int>>& cost, int m, int n, int target) {
        memset(memo, -1, sizeof(memo));
        int answer = findMinCost(houses, cost, target, 0, 0, 0);
        return answer == MAX_COST ? -1 : answer;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Курсы JAVA-разработки Гарантия ЗП от 120 000р в договоре Jаvа — это язык, на котором строятся банковские системы, мобильные п
Курсы JAVA-разработки Гарантия ЗП от 120 000р в договоре Jаvа — это язык, на котором строятся банковские системы, мобильные приложения, крупные веб-сервисы и многое другое, а спрос на Jаvа-разработчиков стабильно высок. Благодаря кроссплатформенности и надежности, ты сможешь работать в любой сфере IТ — от финансов до Коммерческой отрасли.📊💰 Почему это работает?✨ - Минимальные вложения. - Тысячи человек уже в IТ. Наши выпускники работают в крутых компаниях: от стартапов до международных корпораций. - Наши менторы — это опытные разработчики, которые ежедневно работают в IТ и готовы делиться актуальными знаниями. P.S. Если всё ещё сомневаешься и думаешь что будет сложно — просто попробуй.😊 Мы берем на себя все риски: ты оплачиваешь основную стоимость обучения только после успешного трудоустройства — это закреплено в договоре. Подать заявку #реклама 16+ kata.academy О рекламодателе

Задача: 506. Relative Ranks Сложность: easy Вам дан целочисленный массив score размером n, где score[i] — это результат i-го спортсмена на соревновании. Все результаты гарантированно уникальны. Спортсмены размещаются на основе своих результатов: спортсмен, занявший 1-е место, имеет наивысший результат, спортсмен, занявший 2-е место, имеет второй по величине результат и так далее. Размещение каждого спортсмена определяет его ранг: Ранг спортсмена, занявшего 1-е место, — "Gold Medal". Ранг спортсмена, занявшего 2-е место, — "Silver Medal". Ранг спортсмена, занявшего 3-е место, — "Bronze Medal". Для спортсменов, занявших с 4-го по n-е место, их ранг соответствует их номеру в размещении (т.е. ранг спортсмена, занявшего x-е место, — "x"). Верните массив answer размером n, где answer[i] — это ранг i-го спортсмена. Пример:
Input: score = [5,4,3,2,1]
Output: ["Gold Medal","Silver Medal","Bronze Medal","4","5"]
Explanation: The placements are [1st, 2nd, 3rd, 4th, 5th].
👨‍💻 Алгоритм: 1⃣Инициализация и нахождение максимального значения Инициализируйте переменную N длиной массива score. Определите функцию findMax, которая находит максимальный балл в массиве score. 2⃣Создание вспомогательных структур Инициализируйте массив scoreToIndex размером M + 1, где M — это максимальное значение в массиве score. Заполните scoreToIndex таким образом, чтобы для каждого score[i] его индекс сохранялся в scoreToIndex[score[i]]. 3⃣Присваивание рангов и формирование ответа Создайте массив rank для хранения рангов спортсменов. Используйте цикл для присваивания медалей и рангов в зависимости от значений в scoreToIndex, начиная с наибольшего. 😎 Решение:
class Solution {
public:
    vector<string> findRelativeRanks(vector<int>& score) {
        int N = score.size();
        int maxScore = *max_element(score.begin(), score.end());
        vector<int> scoreToIndex(maxScore + 1, 0);
        
        for (int i = 0; i < N; i++) {
            scoreToIndex[score[i]] = i + 1;
        }
        
        vector<string> rank(N);
        vector<string> MEDALS = {"Gold Medal", "Silver Medal", "Bronze Medal"};
        int place = 1;
        
        for (int i = maxScore; i >= 0; i--) {
            if (scoreToIndex[i] != 0) {
                int originalIndex = scoreToIndex[i] - 1;
                if (place < 4) {
                    rank[originalIndex] = MEDALS[place - 1];
                } else {
                    rank[originalIndex] = to_string(place);
                }
                place++;
            }
        }
        
        return rank;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Битрикс24 обновился: новый дизайн и много нейронки Интерфейс стал чище и легче. Появился AI-ассистент с голосовым вводом, а ещё готовят AI-агентов для бизнес-процессов — они будут сами вести рутину. Онлайн-запись теперь с формами, оплатой и овербукингом, а в мессенджере и звонках — упор на простоту и безопасность. Нейронка анализирует видеозвонки и настраивает CRM, включая поля сделок. Добавили автоматизацию повторных продаж, интеграцию с 1С и новые бизнес-процессы. Смотреть #реклама 16+ lightness.bitrix24.ru О рекламодателе

Задача: 687. Longest Univalue Path Сложность: medium Дано корень бинарного дерева, верните длину самого длинного пути, на котором все узлы имеют одинаковое значение. Этот путь может проходить через корень или не проходить. Длина пути между двумя узлами представлена количеством рёбер между ними. Пример:
Input: root = [5,4,5,1,1,null,5]
Output: 2
Explanation: The shown image shows that the longest path of the same value (i.e. 5).
👨‍💻 Алгоритм: 1⃣Определить рекурсивную функцию solve(), принимающую текущий узел root и значение родительского узла parent. Если root равен NULL, вернуть 0. Рекурсивно вызвать solve() для левого и правого дочернего узлов, передав значение текущего узла как значение родительского узла. 2⃣Обновить переменную ans, если сумма значений для левого и правого узлов больше текущего значения ans. Если значение текущего узла равно значению родительского узла, вернуть max(left, right) + 1, иначе вернуть 0. 3⃣Вызвать solve() с корневым узлом и значением родительского узла -1. Вернуть максимальную длину пути ans.. 😎 Решение:
class Solution {
public:
    int ans = 0;

    int solve(TreeNode* root, int parent) {
        if (root == nullptr) {
            return 0;
        }

        int left = solve(root->left, root->val);
        int right = solve(root->right, root->val);
        
        ans = std::max(ans, left + right);
        
        return root->val == parent ? std::max(left, right) + 1 : 0;
    }

    int longestUnivaluePath(TreeNode* root) {
        solve(root, -1);
        return ans;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Современная магистратура от Центрального университета Хочешь развиваться в сфере ИТ и получить фундаментальные знания с практ
Современная магистратура от Центрального университета Хочешь развиваться в сфере ИТ и получить фундаментальные знания с практикой? Поступай в магистратуру Центрального университета! - 4 офлайн программы по востребованным направлениям ИТ - Онлайн-программа по машинному обучению - 300 мест с грантами до 1,2 млн руб. - Вечерние занятия и учеба по выходным — удобно совмещать с работой - Обучение по модели STEM-образования: на стыке науки, технологий и бизнеса - Возможность стажировок и трудоустройства в ведущих компаниях - Государственный диплом за 2 года Магистратура в Центральном университете — это современный подход к образованию, сильный преподавательский состав и актуальные кейсы от индустрии. Оставляй заявку на грант уже сейчас! Подать заявку #реклама 16+ apply.centraluniversity.ru О рекламодателе