en
Feedback

Don't get caught by a cheater! Telemetrio finds and tags such channels 👉 If you want to see the tag, subscribe

C/C++ | LeetCode

C/C++ | LeetCode

Open in Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads

Show more
3 206
Subscribers
-224 hours
-67 days
-2730 days
Posts Archive
Repost from easyoffer
Что такое PRO-подписка на easyoffer 2.0? easyoffer PRO — это не просто доступ к базе, а полноценный инструмент для получения
Что такое PRO-подписка на easyoffer 2.0? easyoffer PRO — это не просто доступ к базе, а полноценный инструмент для получения оффера. 🧠 База вопросов с собеседований + Анализ на основе 4,000 собеседований + Вероятность встречи каждого вопроса + Фильтрация по грейдам, компаниям, типам интервью + Примеры ответов: текстовые и видео + Готовьтесь к собеседованию в конкретную компанию 🛠 Тренажер "Проработка вопросов" + Флеш-карточки + интервальные повторения + Персональная система показа карточек в зависимости от ваших ответов + Упор на наиболее частые вопросы + Фокус на слабые места и быстрый прогресс 🎭 Тренажер "Реальное собеседование" + Сценарии на основе реальных интервью + Подготовка к конкретным компаниям + Итоговая статистика: прошёл/не прошёл 🧩 База задач с собеседований + Live-coding и System Design задачи + Оценка вероятности встречи задачи + Подготовка к задачам по конкретным компаниям 📋 База тестовых заданий + Задания из реальных вакансий + Фильтрация по технологиям и грейдам + Лучшие решения в доступе 📈 Тренды технологий в вакансиях + Топ-100 навыков, которые требуют компании + Динамика популярности технологий + Фильтрация по грейдам 🎁 Специальная цена до релиза: 3200 руб. за целый год Сейчас PRO на 1 год стоит как будет стоить 1 месяц после релиза. Покупка также открывает доступ к закрытому бета-тестированию. + Вы можете активировать подписку в любой момент, например, когда начнете искать работу. Предзаказ здесь: https://planeta.ru/campaigns/easyoffer 📌 Цена поднимется сразу после запуска. Если вы хотите перестать угадывать, что спросят на собеседовании, и начать точечно готовиться на основе реальных данных — easyoffer PRO именно для вас. Экономьте время. Получайте оффер легко.

Задача: 1146. Snapshot Array Сложность: medium Реализуйте SnapshotArray, который поддерживает следующий интерфейс: SnapshotArray(int length) инициализирует структуру данных, похожую на массив, с заданной длиной. Изначально каждый элемент равен 0. void set(index, val) устанавливает элемент с заданным индексом равным val. int snap() делает снимок массива и возвращает snap_id: общее количество вызовов snap() минус 1. int get(index, snap_id) возвращает значение на заданном индексе в момент, когда мы сделали снимок с указанным snap_id. Пример:
Input: ["SnapshotArray","set","snap","set","get"]
[[3],[0,5],[],[0,6],[0,0]]
Output: [null,null,0,null,5]
Explanation: 
SnapshotArray snapshotArr = new SnapshotArray(3); // set the length to be 3
snapshotArr.set(0,5);  // Set array[0] = 5
snapshotArr.snap();  // Take a snapshot, return snap_id = 0
snapshotArr.set(0,6);
snapshotArr.get(0,0);  // Get the value of array[0] with snap_id = 0, return 5
👨‍💻 Алгоритм: 1⃣Инициализация: Для каждого элемента nums[i] в массиве создайте пустой список для хранения его исторических значений в формате [snap_id, value]. Инициализируйте каждый список, добавив первую запись [0, 0]. 2⃣Метод set: Добавьте историческую запись [snap_id, value] в список записей historyRecords[index]. 3⃣Методы snap и get: Метод snap возвращает snap_id и увеличивает его на 1. Метод get использует бинарный поиск, чтобы найти индекс последней вставки snap_id в данный снимок (целевой индекс будет snap_index - 1). Возвращает historyRecords[index][snap_index - 1][1]. 😎 Решение:
class SnapshotArray {
public:
    int snapId = 0;
    vector<map<int, int>> historyRecords;
    
    SnapshotArray(int length) {
        historyRecords.resize(length);
        for (int i = 0; i < length; i++) {
            historyRecords[i][0] = 0;
        }
    }

    void set(int index, int val) {
        historyRecords[index][snapId] = val;
    }

    int snap() {
        return snapId++;
    }

    int get(int index, int snapId) {
        auto it = historyRecords[index].upper_bound(snapId);
        return prev(it)->second;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Задача: 998. Maximum Binary Tree II Сложность: medium Максимальное дерево - это дерево, в котором каждый узел имеет значение большее, чем любое другое значение в его поддереве. Вам дан корень максимального двоичного дерева и целое число val. Как и в предыдущей задаче, данное дерево было построено из списка a (root = Construct(a)) рекурсивно с помощью следующей процедуры Construct(a): Если a пусто, верните null. В противном случае пусть a[i] - наибольший элемент a. Создайте корневой узел со значением a[i]. Левым ребенком root будет Construct([a[0], a[1], ..., a[i - 1]]). Правым ребенком root будет Construct([a[i + 1], a[i + 2], ..., a[a.length])...., a[a.length - 1]]). Возвращаем root. Обратите внимание, что нам не было дано непосредственно a, а только корневой узел root = Construct(a). Предположим, что b - это копия a с добавленным к ней значением val. Гарантируется, что b имеет уникальные значения. Возвращаем Construct(b). Пример:
Input: n = 2, trust = [[1,2]]
Output: 2
👨‍💻 Алгоритм: 1⃣Поиск места вставки: Итерируйте через дерево, начиная с корня. Найдите место для вставки нового значения val так, чтобы дерево оставалось максимальным деревом. Если значение val больше, чем значение текущего узла, создайте новый узел с val и сделайте текущий узел его левым ребенком. 2⃣Вставка нового узла: Если значение val меньше, чем значение текущего узла, продолжайте спускаться по правому поддереву, пока не найдете место для вставки. 3⃣Создание нового дерева: После вставки нового узла убедитесь, что дерево сохраняет свои свойства максимального дерева. 😎 Решение:
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    TreeNode* insertIntoMaxTree(TreeNode* root, int val) {
        if (!root || val > root->val) {
            TreeNode* newNode = new TreeNode(val);
            newNode->left = root;
            return newNode;
        }
        root->right = insertIntoMaxTree(root->right, val);
        return root;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Задача: 690. Employee Importance Сложность: medium У вас есть структура данных с информацией о сотрудниках, включая уникальный идентификатор сотрудника, значение его важности и идентификаторы его прямых подчиненных. Вам дан массив сотрудников employees, где: employees[i].id — это идентификатор i-го сотрудника. employees[i].importance — значение важности i-го сотрудника. employees[i].subordinates — список идентификаторов прямых подчиненных i-го сотрудника. Дан целочисленный id, представляющий идентификатор сотрудника. Верните суммарное значение важности этого сотрудника и всех его прямых и косвенных подчиненных. Пример:
Input: employees = [[1,5,[2,3]],[2,3,[]],[3,3,[]]], id = 1
Output: 11
Explanation: Employee 1 has an importance value of 5 and has two direct subordinates: employee 2 and employee 3.
They both have an importance value of 3.
Thus, the total importance value of employee 1 is 5 + 3 + 3 = 11.
👨‍💻 Алгоритм: 1⃣Создайте хеш-таблицу emap для быстрого доступа к сотрудникам по их идентификаторам. 2⃣Реализуйте функцию DFS для подсчета общей важности, которая включает важность сотрудника и всех его подчиненных. 3⃣Используйте DFS для вычисления общей важности, начиная с заданного идентификатора сотрудника. 😎 Решение:
class Employee {
public:
    int id;
    int importance;
    vector<int> subordinates;
};

class Solution {
    unordered_map<int, Employee*> emap;
    
public:
    int getImportance(vector<Employee*> employees, int queryid) {
        for (Employee* e : employees) {
            emap[e->id] = e;
        }
        return dfs(queryid);
    }
    
    int dfs(int eid) {
        Employee* employee = emap[eid];
        int ans = employee->importance;
        for (int subid : employee->subordinates) {
            ans += dfs(subid);
        }
        return ans;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Искусственный интеллект сам создаёт продающие сайты! В Битрикс24 появился AI-помощник, который за пару минут генерирует страницы с контентом и дизайном. А за подробностями переходите по ссылке Узнать больше #реклама sites-24.bitrix24.ru О рекламодателе

Repost from easyoffer
🎉 Easyoffer 2.0 — самый успешный краудфандинг в истории рунета в категории "Технологии"! Мы это сделали! За считанные часы п
🎉 Easyoffer 2.0 — самый успешный краудфандинг в истории рунета в категории "Технологии"! Мы это сделали! За считанные часы после старта, благодаря вашей поддержке, проект не просто стартовал — он взлетел. 💸 Собрано: 2 276 840 рублей Это не просто цифра — это ваше доверие, ваша вера в идею, и ваша инвестиция в будущее карьеры сотен (а скоро — тысяч) специалистов. 💼 Благодаря этой сумме мы уже: — Наняли ещё пару разработчиков и аналитиков — Запустили активный сбор и разметку новых данных — Ускорили разработку и подняли планку качества Спасибо каждому, кто поверил в нас на старте! Дальше — только масштабирование и развитие. Мы строим сервис, который станет must-have для всех, кто ищет работу в IT. 👉 Присоединяйтесь сейчас — это только начало.

Задача: 835. Image Overlap Сложность: medium Вам даны два изображения, img1 и img2, представленные как бинарные квадратные матрицы размером n x n. Бинарная матрица содержит только 0 и 1 в качестве значений. Мы можем сдвигать одно изображение как угодно, перемещая все биты 1 влево, вправо, вверх и/или вниз на любое количество единиц. Затем мы помещаем его поверх другого изображения. После этого мы можем вычислить перекрытие, подсчитав количество позиций, на которых в обоих изображениях есть 1. Также обратите внимание, что при сдвиге не допускается никакое вращение. Любые биты 1, которые перемещаются за пределы границ матрицы, стираются. Верните максимальное возможное перекрытие. Пример:
Input: img1 = [[1,1,0],[0,1,0],[0,1,0]], img2 = [[0,0,0],[0,1,1],[0,0,1]]
Output: 3
Explanation: We translate img1 to right by 1 unit and down by 1 unit.
👨‍💻 Алгоритм: 1⃣Определите функцию shiftAndCount(xShift, yShift, M, R), которая смещает матрицу M относительно матрицы R на координаты (xShift, yShift) и подсчитывает количество единиц в зоне перекрытия. 2⃣Организуйте цикл по всем возможным комбинациям координат смещения (xShift, yShift). 3⃣На каждой итерации вызывайте функцию shiftAndCount() дважды для обоих направлений смещения и обновляйте максимальное количество перекрытий. 😎 Решение:
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
    int shiftAndCount(int xShift, int yShift, vector<vector<int>>& M, vector<vector<int>>& R) {
        int leftShiftCount = 0, rightShiftCount = 0;
        int rRow = 0;
        for (int mRow = yShift; mRow < M.size(); ++mRow) {
            int rCol = 0;
            for (int mCol = xShift; mCol < M.size(); ++mCol) {
                if (M[mRow][mCol] == 1 && M[mRow][mCol] == R[rRow][rCol])
                    leftShiftCount++;
                if (M[mRow][rCol] == 1 && M[mRow][rCol] == R[rRow][mCol])
                    rightShiftCount++;
                rCol++;
            }
            rRow++;
        }
        return max(leftShiftCount, rightShiftCount);
    }

    int largestOverlap(vector<vector<int>>& A, vector<vector<int>>& B) {
        int maxOverlaps = 0;
        for (int yShift = 0; yShift < A.size(); ++yShift) {
            for (int xShift = 0; xShift < A.size(); ++xShift) {
                maxOverlaps = max(maxOverlaps, shiftAndCount(xShift, yShift, A, B));
                maxOverlaps = max(maxOverlaps, shiftAndCount(xShift, yShift, B, A));
            }
        }
        return maxOverlaps;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Задача: 945. Minimum Increment to Make Array Unique Сложность: medium Вам дан целочисленный массив nums. За один ход вы можете выбрать индекс i, где 0 <= i < nums.length, и увеличить nums[i] на 1. Верните минимальное количество ходов, чтобы каждое значение в nums было уникальным. Тестовые примеры генерируются так, чтобы ответ умещался в 32-битное целое число. Пример:
Input: nums = [1,2,2]
Output: 1
👨‍💻 Алгоритм: 1⃣Отсортировать массив nums. Инициализировать переменную moves для подсчета количества ходов. 2⃣Пройти по массиву и для каждого элемента, начиная со второго: Если текущий элемент меньше или равен предыдущему элементу, увеличить текущий элемент до значения предыдущего элемента + 1 и обновить счетчик ходов. 3⃣Вернуть общее количество ходов. 😎 Решение:
class Solution {
public:
    int minIncrementForUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int moves = 0;
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] <= nums[i - 1]) {
                moves += nums[i - 1] + 1 - nums[i];
                nums[i] = nums[i - 1] + 1;
            }
        }
        return moves;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Дарим подписку на Яндекс Музыку Ответьте на 1 вопрос и Яндекс Музыка ваша для вас и 3-х ваших близких. Кинопоиск и Яндекс Книги тоже в подписке. Попробуйте бесплатно❤️ Попробовать #реклама 18+ music.yandex.ru О рекламодателе Реклама на Яндексе

Задача: 1134. Armstrong Number Сложность: easy Дано целое число n, верните true, если и только если оно является числом Армстронга. k-значное число n является числом Армстронга, если сумма k-й степени каждой его цифры равна n. Пример:
Input: n = 153
Output: true
Explanation: 153 is a 3-digit number, and 153 = 1^3 + 5^3 + 3^3.
👨‍💻 Алгоритм: 1⃣Получите количество цифр в n, преобразовав его в строку и найдя длину. 2⃣Создайте функцию getSumOfKthPowerOfDigits(n, k), которая возвращает сумму k-й степени каждой цифры числа n. Инициализируйте переменную result для хранения результата. Пока n не равно 0, добавляйте k-ю степень последней цифры n к result и удаляйте последнюю цифру. 3⃣ Верните true, если результат равен исходному числу n. 😎 Решение:
class Solution {
public:
    int getSumOfKthPowerOfDigits(int n, int k) {
        int result = 0;
        while (n != 0) {
            int digit = n % 10;
            result += pow(digit, k);
            n /= 10;
        }
        return result;
    }

    bool isArmstrong(int n) {
        int length = to_string(n).length();
        return getSumOfKthPowerOfDigits(n, length) == n;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Ищешь высокооплачиваемые проекты? Попробуй SkillStaff SkillStaff — это платформа для ИТ-специалистов, менеджеров и креаторов,
Ищешь высокооплачиваемые проекты? Попробуй SkillStaff SkillStaff — это платформа для ИТ-специалистов, менеджеров и креаторов, которым мало одного оклада. Здесь можно найти клиентов, выполнять их проекты и увеличивать свой доход. - Проекты с гибким графиком: part time, full time, удаленка и гибрид - Ставка за час работы — та, что ты сам выбрал - Клиенты — ведущие бренды, проверенные с юридической точки зрения при регистрации на платформе - Оплата поступает ежемесячно на расчетный счет исполнителя - Удобный личный кабинет и функционал, автоматизирующий документооборот Все, что нужно для работы — иметь статус самозанятого или ИП, а платформа поможет со всеми нюансами. Регистрируйся прямо сейчас Зарегистрироваться #реклама 16+ skillstaff.ru О рекламодателе

Задача: 78. Subsets Сложность: medium Дан массив целых чисел nums, содержащий уникальные элементы. Верните все возможные подм
Задача: 78. Subsets Сложность: medium Дан массив целых чисел nums, содержащий уникальные элементы. Верните все возможные подмножества (степенной набор). Результат не должен содержать повторяющихся подмножеств и может быть в любом порядке. Пример:
Input: nums = [1,2,3]
Output: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
👨‍💻 Алгоритм: 1⃣Определим функцию backtrack(first, curr), где first — индекс, с которого начинаем выбирать элементы, curr — текущее подмножество. 2⃣Если curr.size() == k, добавляем его копию в итог output. 3⃣Перебираем индексы i от first до n, добавляем nums[i] в curr, вызываем backtrack(i + 1, curr), затем удаляем nums[i]. 😎 Решение:
class Solution {
public:
    vector<vector<int>> output;
    int n, k;

    void backtrack(int first, vector<int> curr, vector<int>& nums) {
        if (curr.size() == k) output.push_back(curr);
        for (int i = first; i < n; ++i) {
            curr.push_back(nums[i]);
            backtrack(i + 1, curr, nums);
            curr.pop_back();
        }
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        n = nums.size();
        for (k = 0; k < n + 1; ++k) {
            vector<int> curr;
            backtrack(0, curr, nums);
        }
        return output;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

Многофункциональные модули ввода / вывода ELHART Alpha X Нужно расширить ПЛК дополнительными входами/выходами? Ищете надежные
Многофункциональные модули ввода / вывода ELHART Alpha X Нужно расширить ПЛК дополнительными входами/выходами? Ищете надежные модули RS-485 с Modbus RTU? Линейка ELHART Alpha-X – это: - Более 10 модификаций дискретных, аналоговых и комбинированных модулей; - Единая карта регистров для всех модулей; - Компактный корпус, ширина 18мм; - Питание и интерфейс RS-485 по шине; - Возможность настройки с помощью интерактивного конфигуратора; - До 31 модуля на одной шине; ⚡ Настройка адреса и скорости dip-переключателями; ⚡ Встроенные счётчики и частотомеры до 4 кГц; ⚡ Гальваническая изоляция интерфейса, входов и выходов от питания; ⚡ Точность измерения для унифицированных сигналов 0,1%, для датчиков температуры 0,25%; ⚡ Разработка и производство в РФ; Для тех, кто ценит функциональность и качество. Полная техническая поддержка. Узнать больше #реклама kipservis.ru О рекламодателе

Задача: 255. Verify Preorder Sequence in Binary Search Tree Сложность: medium Дан массив preorder, содержащий уникальные целы
Задача: 255. Verify Preorder Sequence in Binary Search Tree Сложность: medium Дан массив preorder, содержащий уникальные целые числа. Нужно определить, может ли данный массив представлять собой префиксный (preorder) обход бинарного дерева поиска (BST). Пример:
Input: preorder = [5,2,1,3,6] Output: true
👨‍💻 Алгоритм: 1⃣Инициализация Объявляем переменную minLimit = -∞ (используем INT_MIN) и создаём стек stack, в котором будем хранить предков текущего узла. 2⃣Обход массива Для каждого числа num в preorder: – Если stack.top() < num, значит, мы поднимаемся по дереву вправо, поэтому извлекаем все такие элементы из стека и обновляем minLimit. – Если num <= minLimit, это значит, что текущий элемент нарушает свойства BST — возвращаем false. – Иначе, помещаем num в стек. 3⃣Результат Если весь массив обработан без нарушений — возвращаем true. 😎 Решение:
#include <vector>
#include <stack>
#include <limits.h>

using namespace std;

class Solution {
public:
    bool verifyPreorder(vector<int>& preorder) {
        int minLimit = INT_MIN;
        stack<int> stack;

        for (int num : preorder) {
            while (!stack.empty() && stack.top() < num) {
                minLimit = stack.top();
                stack.pop();
            }

            if (num <= minLimit) {
                return false;
            }

            stack.push(num);
        }

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

👨‍💻 Баттлы по программированию на C++ X5 Tech Sprint — соревнования по кодингу прямо в супермаркетах «Перекрёсток» рядом с
👨‍💻 Баттлы по программированию на C++ X5 Tech Sprint — соревнования по кодингу прямо в супермаркетах «Перекрёсток» рядом с твоим вузом. Забирай крутые призы: — фаст-трек на стажировку в X5 Tech для ТОП-25 участников общего рейтинга — 50 000 рублей для ТОП-5 самых быстрых кодеров — в ежедневном розыгрыше: сертификат на 3 000 рублей на покупки в «Перекрёстке» Пора воспользоваться своими скиллами — успей принять участие с 12 по 19 апреля! 🌐 Подробнее о соревновании на сайте.

Repost from easyoffer
⏳ Осталось всего 14 дней до завершения краудфандинга Сейчас самое подходящее время подключиться, если вы ждали или откладывал
⏳ Осталось всего 14 дней до завершения краудфандинга Сейчас самое подходящее время подключиться, если вы ждали или откладывали: Все, кто поддержат проект сейчас, до релиза, получат: 🚀 PRO-доступ на 1 год по цене месячной подписки ➕ Бета-доступ к EasyOffer 2.0 (конец мая) 👉 Поддержать: https://planeta.ru/campaigns/easyoffer

Задача: 1094. Car Pooling Сложность: medium Есть автомобиль с пустыми сиденьями емкостью capacity. Автомобиль движется только на восток (то есть он не может повернуть и ехать на запад). Дан целочисленный параметр capacity и массив поездок trips, где trips[i] = [numPassengersi, fromi, toi] указывает, что на i-й поездке numPassengersi пассажиров должны быть забраны на позиции fromi и высажены на позиции toi. Позиции заданы как количество километров на восток от начальной точки автомобиля. Верните true, если возможно забрать и высадить всех пассажиров для всех указанных поездок, или false в противном случае. Пример:
Input: trips = [[2,1,5],[3,3,7]], capacity = 4
Output: false
👨‍💻 Алгоритм: 1⃣Простая идея заключается в том, чтобы пройти от начала до конца и проверить, превышает ли фактическая вместимость capacity. 2⃣Чтобы узнать фактическую вместимость, нужно просто знать изменение количества пассажиров в каждый момент времени. 3⃣Мы можем сохранить изменения количества пассажиров в каждый момент времени, отсортировать их по меткам времени и, наконец, пройтись по ним, чтобы проверить фактическую вместимость. 😎 Решение:
#include <vector>
#include <map>
using namespace std;

class Solution {
public:
    bool carPooling(vector<vector<int>>& trips, int capacity) {
        map<int, int> timestamp;
        for (auto& trip : trips) {
            timestamp[trip[1]] += trip[0];
            timestamp[trip[2]] -= trip[0];
        }
        int usedCapacity = 0;
        for (auto& change : timestamp) {
            usedCapacity += change.second;
            if (usedCapacity > capacity) {
                return false;
            }
        }
        return true;
    }
};
Ставь 👍 и забирай 📚 Базу знаний

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

Задача: 1319. Number of Operations to Make Network Connected Сложность: medium Дано n компьютеров, пронумерованных от 0 до n - 1, соединённых Ethernet-кабелями connections, образующими сеть, где connections[i] = [ai, bi] представляет собой соединение между компьютерами ai и bi. Любой компьютер может достичь любого другого компьютера напрямую или косвенно через сеть. Вам даны начальные соединения сети. Вы можете извлекать определённые кабели между двумя напрямую соединёнными компьютерами и размещать их между любыми парами несоединённых компьютеров, чтобы сделать их напрямую соединёнными. Верните минимальное количество раз, которое необходимо сделать это, чтобы соединить все компьютеры. Если это невозможно, верните -1. Пример:
Input: n = 4, connections = [[0,1],[0,2],[1,2]]
Output: 1
Explanation: Remove cable between computer 1 and 2 and place between computers 1 and 3.
👨‍💻 Алгоритм: 1⃣Проверьте размер connections. Если он меньше n - 1, у нас недостаточно ребер, чтобы соединить весь граф. В этом случае возвращаем -1. 2⃣Создайте список смежности с помощью connections, где adj[x] содержит всех соседей узла x. Создайте целое число numberOfConnectedComponents, которое хранит количество компонент связности в графе. Инициализируйте его значением 0. 3⃣Создайте массив visit длиной n для отслеживания посещенных узлов. Пройдите по всем узлам, и для каждого узла i проверьте, был ли он посещен. Если узел i не был посещен, увеличьте numberOfConnectedComponents на 1 и начните обход DFS: Используйте функцию dfs для выполнения обхода. Для каждого вызова передавайте узел, ребра и visit в качестве параметров, начиная с узла i. Отметьте узел как посещенный. Пройдитесь по всем соседям узла. Если какой-либо сосед еще не был посещен, рекурсивно вызовите dfs с этим соседом в качестве узла. Верните numberOfConnectedComponents - 1. 😎 Решение:
class Solution {
public:
    void dfs(int node, unordered_map<int, vector<int>>& adj, vector<bool>& visit) {
        visit[node] = true;
        if (adj.find(node) == adj.end()) {
            return;
        }
        for (int neighbor : adj[node]) {
            if (!visit[neighbor]) {
                visit[neighbor] = true;
                dfs(neighbor, adj, visit);
            }
        }
    }

    int makeConnected(int n, vector<vector<int>>& connections) {
        if (connections.size() < n - 1) {
            return -1;
        }

        unordered_map<int, vector<int>> adj;
        for (auto& connection : connections) {
            adj[connection[0]].push_back(connection[1]);
            adj[connection[1]].push_back(connection[0]);
        }

        int numberOfConnectedComponents = 0;
        vector<bool> visit(n, false);
        for (int i = 0; i < n; i++) {
            if (!visit[i]) {
                numberOfConnectedComponents++;
                dfs(i, adj, visit);
            }
        }

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

Задача: 912. Sort an Array Сложность: medium Задав массив целых чисел nums, отсортируйте массив по возрастанию и верните его. Вы должны решить задачу без использования встроенных функций за время O(nlog(n)) и с минимально возможной пространственной сложностью. Пример:
Input: nums = [5,2,3,1]
Output: [1,2,3,5]
👨‍💻 Алгоритм: 1⃣Используем алгоритм "Сортировка слиянием" (Merge Sort), который обеспечивает время выполнения O(n log n) и минимально возможную пространственную сложность для стабильного сортировочного алгоритма. 2⃣Разделить массив на две половины. Рекурсивно отсортировать каждую половину. 3⃣Слить две отсортированные половины. 😎 Решение:
void merge(vector<int>& nums, int left, int mid, int right) {
    vector<int> left_half(nums.begin() + left, nums.begin() + mid + 1);
    vector<int> right_half(nums.begin() + mid + 1, nums.begin() + right + 1);

    int i = 0, j = 0, k = left;
    while (i < left_half.size() && j < right_half.size()) {
        if (left_half[i] <= right_half[j]) {
            nums[k++] = left_half[i++];
        } else {
            nums[k++] = right_half[j++];
        }
    }

    while (i < left_half.size()) {
        nums[k++] = left_half[i++];
    }

    while (j < right_half.size()) {
        nums[k++] = right_half[j++];
    }
}

void mergeSort(vector<int>& nums, int left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;
        mergeSort(nums, left, mid);
        mergeSort(nums, mid + 1, right);
        merge(nums, left, mid, right);
    }
}
Ставь 👍 и забирай 📚 Базу знаний