Logo
TGCATALOG
Каталог Подборки Блог
C/C++ LeetCode - задачи

C/C++ LeetCode - задачи

LeetCode задачи C/C++.

Нет оценок
1,321
29.10.2026
1,321
29.10.2026
Нет оценок
1,321
29.10.2026
Безопасный переход через бот
О канале

LeetCode задачи C/C++.

Подписчиков 3,208
Тематика Технологии
Язык Русский
Ссылка t.me/easy_c_plus_task

Также рекомендуем

Kekaton AI | Озвучка и клон голоса
Kekaton AI | Озвучка и клон голоса
Бот

AI бот для озвучки текста и клонирования голоса в Telegram. Создавай аудио с помощью нейросети быстро и просто.

Описание

Решения и задачи LeetCode на C/C++.

Последние посты

C/C++ LeetCode - задачи
C/C++ LeetCode - задачи
🔒Открыть пост
и посмотреть медиа
Задача: 680. Valid Palindrome II Сложность: easy Дана строка s, вернуть true, если s может быть палиндромом после удаления не более одного символа из нее. Пример: Input: s = "aba" Output: true 👨💻 Алгоритм: 1⃣Создайте вспомогательную функцию checkPalindrome, которая принимает строку s и два указателя i и j. Эта функция возвращает логическое значение, указывающее, является ли подстрока s.substring(i, j) палиндромом. 2⃣Инициализируйте два указателя: i = 0 и j = s.length() - 1. Пока i < j, проверьте, совпадают ли символы в индексах i и j. Если нет, это значит, что нам нужно удалить один из этих символов. 3⃣Попробуйте оба варианта, используя checkPalindrome. Верните true, если либо checkPalindrome(s, i, j - 1), либо checkPalindrome(s, i + 1, j) возвращает true. Если мы выходим из цикла while, это значит, что исходная строка является палиндромом. Поскольку нам не нужно было использовать удаление, следует вернуть true 😎 Решение: class Solution { bool checkPalindrome(const string& s, int i, int j) { while (i < j) { if (s[i] != s[j]) { return false; } i++; j--; } return true; } public: bool validPalindrome(string s) { int i = 0; int j = s.size() - 1; while (i < j) { if (s[i] != s[j]) { return checkPalindrome(s, i, j - 1) || checkPalindrome(s, i + 1, j); } i++; j--; } return true; } }; Ставь 👍 и забирай 📚 Базу знаний
C/C++ LeetCode - задачи
C/C++ LeetCode - задачи
🔒Открыть пост
и посмотреть медиа
Задача: 974. Subarray Sums Divisible by K Сложность: medium Дан целочисленный массив nums и целое число k. Верните количество непустых подмассивов, сумма которых делится на k. Подмассив — это непрерывная часть массива. Пример: Input: nums = [4,5,0,-2,-3,1], k = 5 Output: 7 Explanation: There are 7 subarrays with a sum divisible by k = 5: [4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3] 👨💻 Алгоритм: 1⃣Инициализация и подготовка. Инициализируйте prefixMod = 0 для хранения остатка от суммы элементов до текущего индекса при делении на k. Инициализируйте result = 0 для хранения количества подмассивов, сумма которых делится на k. Инициализируйте массив modGroups длиной k, где modGroups[R] хранит количество подмассивов с остатком R. Установите modGroups[0] = 1. 2⃣Итерирование по массиву. Для каждого элемента массива nums вычислите новый prefixMod как (prefixMod + nums[i] % k + k) % k, чтобы избежать отрицательных значений. Увеличьте result на значение modGroups[prefixMod], чтобы добавить количество подмассивов с текущим остатком. Увеличьте значение modGroups[prefixMod] на 1 для будущих совпадений. 3⃣Возврат результата. Верните значение result, которое содержит количество подмассивов, сумма которых делится на k. 😎 Решение: class Solution { public: int subarraysDivByK(vector& nums, int k) { int prefixMod = 0, result = 0; vector modGroups(k); modGroups[0] = 1; for (int num : nums) { prefixMod = (prefixMod + num % k + k) % k; result += modGroups[prefixMod]; modGroups[prefixMod]++; } return result; } }; Ставь 👍 и забирай 📚 Базу знаний
C/C++ LeetCode - задачи
C/C++ LeetCode - задачи
🔒Открыть пост
и посмотреть медиа
Задача: 1801. Number of Orders in the Backlog Сложность: medium Дан двумерный целочисленный массив orders, где каждый элемент orders[i] = [pricei, amounti, orderTypei] обозначает, что было размещено amounti заказов типа orderTypei по цене pricei. Тип заказа orderTypei может быть: - 0, если это партия заказов на покупку, или - 1, если это партия заказов на продажу. Обратите внимание, что orders[i] представляет собой партию из amounti независимых заказов с одинаковой ценой и типом. Все заказы, представленные orders[i], будут размещены перед всеми заказами, представленными orders[i+1] для всех допустимых i. Существует список невыполненных заказов (backlog), который изначально пуст. При размещении заказа происходит следующее: - Если это заказ на покупку, вы просматриваете заказ на продажу с наименьшей ценой в списке невыполненных заказов. Если цена этого заказа на продажу меньше или равна цене текущего заказа на покупку, они будут сопоставлены и выполнены, и этот заказ на продажу будет удален из списка. В противном случае заказ на покупку добавляется в список невыполненных заказов. - Если это заказ на продажу, вы просматриваете заказ на покупку с наибольшей ценой в списке невыполненных заказов. Если цена этого заказа на покупку больше или равна цене текущего заказа на продажу, они будут сопоставлены и выполнены, и этот заказ на покупку будет удален из списка. В противном случае заказ на продажу добавляется в список невыполненных заказов. Верните общее количество заказов в списке невыполненных заказов после размещения всех заказов из входных данных. Поскольку это число может быть большим, верните его по модулю 10^9 + 7. Пример: Input: orders = [[10,5,0],[15,2,1],[25,1,1],[30,4,0]] Output: 6 👨💻 Алгоритм: 1⃣Обрабатывайте каждый заказ в orders. Для заказа на покупку сравните с самыми дешевыми заказами на продажу в списке и выполняйте их при возможности, иначе добавьте в список. 2⃣Для заказа на продажу сравните с самыми дорогими заказами на покупку в списке и выполняйте их при возможности, иначе добавьте в список. 3⃣Подсчитайте общее количество оставшихся заказов в списке и верните его по модулю 10^9 + 7. 😎 Решение: class Solution { public: int getNumberOfBacklogOrders(vector& orders) { const int MOD = 1'000'000'007; priority_queue buyOrders; priority_queue sellOrders; for (const auto& order : orders) { int price = order[0], amount = order[1], orderType = order[2]; auto& primaryQueue = orderType == 0 ? sellOrders : buyOrders; auto& secondaryQueue = orderType == 0 ? buyOrders : sellOrders; while (amount > 0 && !primaryQueue.empty() && (orderType == 0 ? primaryQueue.top().first = price)) { auto [topPrice, topAmount] = primaryQueue.top(); primaryQueue.pop(); int executedAmount = min(amount, topAmount); amount -= executedAmount; if (topAmount > executedAmount) primaryQueue.emplace(topPrice, topAmount - executedAmount); } if (amount > 0) secondaryQueue.emplace(price, amount); } auto countTotalOrders = [](auto& queue) { long long total = 0; while (!queue.empty()) { total = (total + queue.top().second) % MOD; queue.pop(); } return total; }; return (countTotalOrders(buyOrders) + countTotalOrders(sellOrders)) % MOD; } }; Ставь 👍 и забирай 📚 Базу знаний
C/C++ LeetCode - задачи
C/C++ LeetCode - задачи
🔒Открыть пост
и посмотреть медиа
Задача: 641. Design Circular Deque Сложность: medium Разработайте свою реализацию круговой двусторонней очереди (deque). Реализуйте класс MyCircularDeque: MyCircularDeque(int k) Инициализирует deque с максимальным размером k. boolean insertFront() Добавляет элемент в переднюю часть Deque. Возвращает true, если операция прошла успешно, или false в противном случае. boolean insertLast() Добавляет элемент в заднюю часть Deque. Возвращает true, если операция выполнена успешно, или false в противном случае. boolean deleteFront() Удаляет элемент из передней части Deque. Возвращает true, если операция прошла успешно, или false в противном случае. boolean deleteLast() Удаляет элемент из задней части Deque. Возвращает true, если операция прошла успешно, или false в противном случае. int getFront() Возвращает передний элемент из Deque. Возвращает -1, если Deque пуст. int getRear() Возвращает последний элемент из Deque. Возвращает -1, если Deque пуст. boolean isEmpty() Возвращает true, если Deque пуст, или false в противном случае. boolean isFull() Возвращает true, если Deque полон, или false в противном случае. Пример: Input ["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"] [[3], [1], [2], [3], [4], [], [], [], [4], []] Output [null, true, true, true, false, 2, true, true, true, 4] 👨💻 Алгоритм: 1⃣Инициализация и проверка состояний: Реализуйте конструктор для инициализации кольцевой двусторонней очереди заданного размера и методы для проверки пустоты и полноты очереди. 2⃣Операции вставки: Реализуйте методы вставки элементов в переднюю и заднюю части очереди с учетом кольцевой структуры. 3⃣Операции удаления: Реализуйте методы удаления элементов из передней и задней частей очереди с учетом кольцевой структуры и методы для получения переднего и заднего элементов очереди. 😎 Решение: class MyCircularDeque { public: MyCircularDeque(int k) : deque(k), front(0), rear(0), size(0), capacity(k) {} bool insertFront(int value) { if (isFull()) return false; front = (front - 1 + capacity) % capacity; deque[front] = value; size++; return true; } bool insertLast(int value) { if (isFull()) return false; deque[rear] = value; rear = (rear + 1) % capacity; size++; return true; } bool deleteFront() { if (isEmpty()) return false; front = (front + 1) % capacity; size--; return true; } bool deleteLast() { if (isEmpty()) return false; rear = (rear - 1 + capacity) % capacity; size--; return true; } int getFront() { if (isEmpty()) return -1; return deque[front]; } int getRear() { if (isEmpty()) return -1; return deque[(rear - 1 + capacity) % capacity]; } bool isEmpty() { return size == 0; } bool isFull() { return size == capacity; } private: vector deque; int front; int rear; int size; int capacity; }; Ставь 👍 и забирай 📚 Базу знаний
C/C++ LeetCode - задачи
C/C++ LeetCode - задачи
🔒Открыть пост
и посмотреть медиа
Задача: 903. Valid Permutations for DI Sequence Сложность: hard Вам дана строка s длины n, где s[i] либо: 'D' означает убывание, либо 'I' означает возрастание. Перестановка perm из n + 1 целых чисел всех целых чисел в диапазоне [0, n] называется допустимой, если для всех допустимых i: если s[i] == 'D', то perm[i] > perm[i + 1], а если s[i] == 'I', то perm[i] < perm[i + 1]. Верните количество допустимых перестановок perm. Поскольку ответ может быть большим, верните его по модулю 109 + 7. Пример: Input: s = "DID" Output: 5 👨💻 Алгоритм: 1⃣Создать двумерный массив dp, где dp[i][j] представляет количество допустимых перестановок длины i, оканчивающихся на j. 2⃣Заполнить массив dp, учитывая условия возрастания и убывания из строки s. 3⃣Вернуть сумму dp[n][j] для всех j, что даст количество допустимых перестановок длины n + 1. 😎 Решение: class Solution { public: int numPermsDISequence(string s) { const int MOD = 1e9 + 7; int n = s.size(); vector dp(n + 1, vector(n + 1, 0)); dp[0][0] = 1; for (int i = 1; i
C/C++ LeetCode - задачи
C/C++ LeetCode - задачи
🔒Открыть пост
и посмотреть медиа
Задача: 58. Length of Last Word Сложность: easy Дана строка s, состоящая из слов и пробелов. Верните длину последнего слова. Слово — это максимальная подстрока без пробелов. Пример: Input: s = "Hello World" Output: 5 👨💻 Алгоритм: 1⃣Идти с конца строки, пропуская пробелы, чтобы найти конец последнего слова 2⃣Затем считать символы до следующего пробела или начала строки — это и будет длина слова 3⃣Вернуть полученную длину 😎 Решение: class Solution { public: int lengthOfLastWord(string s) { int p = s.length() - 1; while (p >= 0 && s[p] == ' ') { p--; } int length = 0; while (p >= 0 && s[p] != ' ') { p--; length++; } return length; } }; Ставь 👍 и забирай 📚 Базу знаний
C/C++ LeetCode - задачи
C/C++ LeetCode - задачи
🔒Открыть пост
и посмотреть медиа
Задача: 846. Hand of Straights Сложность: medium У Алисы есть некоторое количество карт, и она хочет переставить карты в группы так, чтобы каждая группа была размером groupSize и состояла из groupSize последовательных карт. Дан целочисленный массив hand, где hand[i] — это значение, написанное на i-й карте, и целое число groupSize. Верните true, если она может переставить карты, или false в противном случае. Пример: Input: hand = [1,2,3,6,2,3,4,7,8], groupSize = 3 Output: true Explanation: Alice's hand can be rearranged as [1,2,3],[2,3,4],[6,7,8] 👨💻 Алгоритм: 1⃣Проверьте, делится ли длина массива hand на groupSize. Если нет, верните false. 2⃣Создайте карту cardCount для хранения количества каждой карты в массиве hand. 3⃣Итерируйте по массиву hand и обновляйте карту cardCount. Затем итерируйте снова для создания групп: Найдите начальную карту startCard для потенциальной последовательности, уменьшая startCard, пока не найдёте карту, которая отсутствует в карте cardCount. Попробуйте сформировать последовательность из groupSize карт, начиная с startCard. Если какая-либо карта в потенциальной последовательности отсутствует в карте cardCount, верните false. Если последовательность можно сформировать, уменьшите количество каждой карты в последовательности в карте cardCount. 😎 Решение: #include #include #include using namespace std; class Solution { public: bool isNStraightHand(vector& hand, int groupSize) { if (hand.size() % groupSize != 0) { return false; } unordered_map cardCount; for (int card : hand) { cardCount[card]++; } sort(hand.begin(), hand.end()); for (int card : hand) { if (cardCount[card] == 0) { continue; } for (int nextCard = card; nextCard < card + groupSize; nextCard++) { if (cardCount[nextCard] == 0) { return false; } cardCount[nextCard]--; } } return true; } }; Ставь 👍 и забирай 📚 Базу знаний
C/C++ LeetCode - задачи
C/C++ LeetCode - задачи
🔒Открыть пост
и посмотреть медиа
Задача: 1252. Cells with Odd Values in a Matrix Сложность: easy Имеется матрица m x n, которая инициализирована всеми 0. Имеется двумерный массив indices, в котором каждый indices[i] = [ri, ci] представляет собой местоположение с индексом 0 для выполнения некоторых операций инкремента над матрицей. Для каждого местоположения indices[i] выполните оба следующих действия: увеличьте все ячейки в строке ri. Увеличьте все ячейки в столбце ci. Учитывая m, n и indices, верните количество нечетных ячеек в матрице после применения инкремента ко всем местоположениям в indices. Пример: Input: nums = [12,5,7,23] Output: true 👨💻 Алгоритм: 1⃣Инициализируйте два массива: один для подсчета количества инкрементов каждой строки, другой - каждого столбца. 2⃣Для каждого элемента в indices увеличьте счетчики соответствующих строк и столбцов. 3⃣Подсчитайте количество нечетных ячеек, используя информацию о количестве инкрементов каждой строки и столбца. 😎 Решение: class Solution { public: int oddCells(int m, int n, vector& indices) { vector row_count(m, 0); vector col_count(n, 0); for (auto& index : indices) { row_count[index[0]]++; col_count[index[1]]++; } int odd_count = 0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if ((row_count[i] + col_count[j]) % 2 == 1) { odd_count++; } } } return odd_count; } }; Ставь 👍 и забирай 📚 Базу знаний
C/C++ LeetCode - задачи
C/C++ LeetCode - задачи
🔒Открыть пост
и посмотреть медиа
Задача: 918. Maximum Sum Circular Subarray Сложность: medium Если задан круговой целочисленный массив nums длины n, верните максимально возможную сумму непустого подмассива nums. Круговой массив означает, что конец массива соединяется с его началом. Формально, следующий элемент nums[i] равен nums[(i + 1) % n], а предыдущий элемент nums[i] равен nums[(i - 1 + n) % n]. Подмассив может включать каждый элемент фиксированного буфера nums не более одного раза. Формально, для подмассива nums[i], nums[i + 1], ..., nums[j] не существует i
C/C++ LeetCode - задачи
Динамика подписчиков
+-0.6% за 30 дней
Текущие
3,208
Месяц назад
3,228
Средний рост
+-1 / день
Обновлено
5 часов назад

Отзывы о канале C/C++ LeetCode - задачи

Авторизуйтесь, чтобы оставить отзыв

Только зарегистрированные пользователи могут делиться своим мнением.

Пока нет отзывов

Станьте первым, кто поделится своим впечатлением об этом ресурсе!

Похожие ресурсы

Loading
Переход на светлую тему
Главная Каталог Подборки Блог Вход