и посмотреть медиа
C# LeetCode - tasks
и посмотреть медиа
LeetCode C#.
AI bot for text-to-speech and voice cloning in Telegram. Create audio using neural network quickly and easily.
LeetCode tasks in C#.
Задача: 1028. Recover a Tree From Preorder Traversal Сложность: hard Мы запускаем предварительный поиск в глубину (DFS) на корне двоичного дерева. На каждый узел в этом обходе мы выводим D тире (где D - глубина этого узла), а затем выводим значение этого узла.Если глубина узла равна D, то глубина его ближайшего потомка равна D + 1.Глубина корневого узла равна 0. Если у узла есть только один ребенок, то этот ребенок гарантированно является левым ребенком. Учитывая выходной обход этого обхода, восстановите дерево и верните его корень. Пример: Input: traversal = "1-2--3--4-5--6--7" Output: [1,2,5,3,4,6,7] 👨💻 Алгоритм: 1⃣Разбор строки: Пройдите по строке, чтобы определить уровни узлов и их значения. Используйте два счетчика: один для отслеживания текущего уровня (количество тире), второй для значения узла. 2⃣Создание узлов: Создайте новые узлы на основе уровня и значения из строки. Для каждого нового узла найдите его родительский узел из стека и добавьте узел как левого или правого ребенка. 3⃣Построение дерева: Используйте стек для отслеживания текущих узлов на каждом уровне глубины. Когда узел создан, добавьте его в стек. Если узел завершен, уберите его из стека. 😎 Решение: public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int x) { val = x; } } public class Solution { public TreeNode RecoverFromPreorder(string S) { var stack = new Stack(); for (int i = 0; i < S.Length;) { int level = 0; while (i < S.Length && S[i] == '-') { level++; i++; } int value = 0; while (i < S.Length && char.IsDigit(S[i])) { value = value * 10 + (S[i] - '0'); i++; } TreeNode node = new TreeNode(value); if (level == stack.Count) { if (stack.Count > 0) { stack.Peek().left = node; } } else { while (level != stack.Count) { stack.Pop(); } stack.Peek().right = node; } stack.Push(node); } while (stack.Count > 1) { stack.Pop(); } return stack.Peek(); } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаЗадача: 1539. Kth Missing Positive Number Сложность: easy Дан массив arr из положительных целых чисел, отсортированных в строго возрастающем порядке, и целое число k. Верните k-й положительный целочисленный элемент, который отсутствует в этом массиве. Пример: Input: arr = [2,3,4,7,11], k = 5 Output: 9 Explanation: The missing positive integers are [1,5,6,8,9,10,12,13,...]. The 5th missing positive integer is 9. 👨💻 Алгоритм: 1⃣Проверьте, является ли k-й отсутствующий номер меньше первого элемента массива. Если это так, верните k. Уменьшите k на количество положительных чисел, отсутствующих до начала массива: k -= arr[0] - 1. 2⃣Итерируйтесь по элементам массива. На каждом шаге вычисляйте количество отсутствующих положительных чисел между i+1-м и i-м элементами: currMissing = arr[i + 1] - arr[i] - 1. Сравните k с currMissing. Если k
Открыть канал и посмотреть медиаЗадача: 1203. Sort Items by Groups Respecting Dependencies Сложность: hard Есть n предметов, каждый из которых принадлежит нулевой или одной из m групп, где group[i] — это группа, к которой принадлежит i-й предмет, и равно -1, если i-й предмет не принадлежит никакой группе. Предметы и группы имеют индексацию с нуля. Группа может не иметь ни одного предмета. Верните отсортированный список предметов таким образом: Предметы, принадлежащие одной группе, расположены рядом друг с другом в отсортированном списке. Существуют некоторые отношения между этими предметами, где beforeItems[i] — это список, содержащий все предметы, которые должны быть перед i-м предметом в отсортированном массиве (слева от i-го предмета). Верните любое решение, если существует более одного решения, и верните пустой список, если решения не существует. Пример: Input: n = 8, m = 2, group = [-1,-1,1,0,0,1,0,-1], beforeItems = [[],[6],[5],[6],[3,6],[],[],[]] Output: [6,3,4,1,5,2,0,7] 👨💻 Алгоритм: 1⃣Инициализация и создание графов: Присвоить уникальные идентификаторы группам для элементов без группы. Создать два графа: item_graph для элементов и group_graph для групп. Также создать два массива для учета входящих рёбер для элементов и групп. 2⃣Построение графов: Пройти по массиву beforeItems и добавить зависимости между элементами в item_graph, увеличивая счётчик входящих рёбер. Если элементы принадлежат разным группам, добавить зависимость между группами в group_graph, увеличивая счётчик входящих рёбер. 3⃣Топологическая сортировка и создание итогового списка: Выполнить топологическую сортировку для элементов и групп. Если есть цикл, вернуть пустой список. Создать итоговый список, добавляя отсортированные элементы каждой группы. 😎 Решение: public class Solution { public int[] SortItems(int n, int m, int[] group, IList beforeItems) { int groupId = m; for (int i = 0; i < n; i++) if (group[i] == -1) group[i] = groupId++; var itemGraph = new Dictionary(); var groupGraph = new Dictionary(); int[] itemIndegree = new int[n], groupIndegree = new int[groupId]; for (int i = 0; i < n; i++) itemGraph[i] = new List(); for (int i = 0; i < groupId; i++) groupGraph[i] = new List(); for (int curr = 0; curr < n; curr++) { foreach (var prev in beforeItems[curr]) { itemGraph[prev].Add(curr); itemIndegree[curr]++; if (group[curr] != group[prev]) { groupGraph[group[prev]].Add(group[curr]); groupIndegree[group[curr]]++; } } } var itemOrder = TopologicalSort(itemGraph, itemIndegree); var groupOrder = TopologicalSort(groupGraph, groupIndegree); if (itemOrder.Count == 0 || groupOrder.Count == 0) return new int[0]; var orderedGroups = new Dictionary(); foreach (var item in itemOrder) { if (!orderedGroups.ContainsKey(group[item])) orderedGroups[group[item]] = new List(); orderedGroups[group[item]].Add(item); } var answerList = new List(); foreach (var groupIndex in groupOrder) { if (orderedGroups.ContainsKey(groupIndex)) answerList.AddRange(orderedGroups[groupIndex]); } return answerList.ToArray(); } private List TopologicalSort(Dictionary graph, int[] indegree) { var visited = new List(); var stack = new Stack(); foreach (var key in graph.Keys) if (indegree[key] == 0) stack.Push(key); while (stack.Count > 0) { var curr = stack.Pop(); visited.Add(curr); foreach (var next in graph[curr]) if (--indegree[next] == 0) stack.Push(next); } return visited.Count == graph.Keys.Count ? visited : new List(); } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаЗадача: 360. Sort Transformed Array Сложность: medium Дан отсортированный массив целых чисел nums и три целых числа a, b и c. Примените квадратичную функцию вида f(x) = ax^2 + bx + c к каждому элементу nums[i] в массиве и верните массив в отсортированном порядке. Пример: Input: nums = [-4,-2,2,4], a = 1, b = 3, c = 5 Output: [3,9,15,33] 👨💻 Алгоритм: 1⃣Преобразование и сортировка Преобразуем каждый элемент массива nums по квадратичной функции f(x) = ax^2 + bx + c и сохраняем результаты в массив transformed. Используем алгоритм поразрядной сортировки для сортировки массива transformed. 2⃣Поразрядная сортировка Находим максимальное значение по модулю в массиве для определения количества цифр. Применяем поразрядную сортировку к массиву transformed. 3⃣Сортировка по цифре Для каждой цифры (разряда) используем подсчет для сортировки массива. 😎 Решение: using System; using System.Collections.Generic; using System.Linq; public class Solution { public int[] SortTransformedArray(int[] nums, int a, int b, int c) { int[] transformed = nums.Select(x => a * x * x + b * x + c).ToArray(); RadixSort(transformed); return transformed; } private void RadixSort(int[] array) { int maxElement = array.Select(x => Math.Abs(x)).Max(); int placeValue = 1; while (maxElement / placeValue > 0) { CountingSortByDigit(array, placeValue); placeValue *= 10; } var negatives = array.Where(x => x < 0).OrderBy(x => x).ToArray(); var positives = array.Where(x => x >= 0).OrderBy(x => x).ToArray(); Array.Copy(negatives, 0, array, 0, negatives.Length); Array.Copy(positives, 0, array, negatives.Length, positives.Length); } private void CountingSortByDigit(int[] array, int placeValue) { int n = array.Length; int[] output = new int[n]; int[] count = new int[10]; foreach (int num in array) { int digit = (Math.Abs(num) / placeValue) % 10; count[digit]++; } for (int i = 1; i < 10; i++) { count[i] += count[i - 1]; } for (int i = n - 1; i >= 0; i--) { int num = array[i]; int digit = (Math.Abs(num) / placeValue) % 10; output[count[digit] - 1] = num; count[digit]--; } for (int i = 0; i < n; i++) { array[i] = output[i]; } } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаЗадача: 905. Sort Array By Parity Сложность: easy Если задан целочисленный массив nums, переместите все четные числа в начало массива, а затем все нечетные. Верните любой массив, удовлетворяющий этому условию. Пример: Input: nums = [3,1,2,4] Output: [2,4,3,1] 👨💻 Алгоритм: 1⃣Создать два списка: один для четных чисел, другой для нечетных. 2⃣Пройтись по массиву и добавить четные числа в один список, а нечетные в другой. 3⃣Объединить два списка и вернуть результат. 😎 Решение: public class Solution { public int[] SortArrayByParity(int[] nums) { List evens = new List(); List odds = new List(); foreach (int num in nums) { if (num % 2 == 0) { evens.Add(num); } else { odds.Add(num); } } evens.AddRange(odds); return evens.ToArray(); } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаЗадача: 674. Longest Continuous Increasing Subsequence Сложность: easy Дан неотсортированный массив целых чисел nums, верните длину самой длинной непрерывной возрастающей подпоследовательности (т.е. подмассива). Подпоследовательность должна быть строго возрастающей. Непрерывная возрастающая подпоследовательность определяется двумя индексами l и r (l < r) так, что она имеет вид [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] и для каждого l = nums[i]. В этом случае начинается новая возрастающая подпоследовательность с nums[i], и мы сохраняем такой i в переменной anchor. 2⃣Например, если nums = [7, 8, 9, 1, 2, 3], то anchor начинается с 0 (nums[anchor] = 7) и затем устанавливается на anchor = 3 (nums[anchor] = 1). Независимо от значения anchor, мы записываем кандидата на ответ длиной i - anchor + 1, длина подмассива nums[anchor], nums[anchor+1], ..., nums[i], и наш ответ обновляется соответствующим образом. 3⃣Возвращаем максимальную длину найденной непрерывной возрастающей подпоследовательности. 😎 Решение: public class Solution { public int FindLengthOfLCIS(int[] nums) { int ans = 0, anchor = 0; for (int i = 0; i < nums.Length; ++i) { if (i > 0 && nums[i-1] >= nums[i]) anchor = i; ans = Math.Max(ans, i - anchor + 1); } return ans; } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаЗадача: 1283. Find the Smallest Divisor Given a Threshold Сложность: medium Дан массив целых чисел nums и целое число threshold. Мы выберем положительный целый делитель, разделим все элементы массива на него и суммируем результат деления. Найдите наименьший делитель, такой что результат, упомянутый выше, меньше или равен threshold. Каждый результат деления округляется до ближайшего большего целого числа. (Например: 7/3 = 3 и 10/2 = 5). Гарантируется, что решение существует. Пример: Input: nums = [1,2,5,9], threshold = 6 Output: 5 Explanation: We can get a sum to 17 (1+2+5+9) if the divisor is 1. If the divisor is 4 we can get a sum of 7 (1+1+2+3) and if the divisor is 5 the sum will be 5 (1+1+1+2). 👨💻 Алгоритм: 1⃣Найдите максимальный элемент массива nums и сохраните его в переменной maxElement. 2⃣Итерация по всем делителям от 1 до maxElement: Инициализируйте две переменные: sumOfDivisionResults для хранения суммы результатов деления и thresholdExceeded для указания, превышен ли порог. Итерация по всем элементам массива nums: добавьте результат деления, округленного до ближайшего большего целого числа, в переменную sumOfDivisionResults. Если сумма превышает threshold, установите thresholdExceeded в true и прекратите итерацию по массиву nums. 3⃣Проверьте, был ли превышен порог: Если порог не был превышен, текущий делитель является наименьшим делителем, поэтому верните его. Если не найдено возможного делителя, верните -1. 😎 Решение: public class Solution { public int SmallestDivisor(int[] nums, int threshold) { int maxElement = nums.Max(); for (int divisor = 1; divisor threshold) { thresholdExceeded = false; break; } } if (thresholdExceeded) { return divisor; } } return -1; } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаЗадача: 1099. Two Sum Less Than K Сложность: easy Дан массив целых чисел nums и целое число k. Верните максимальную сумму, такую что существуют i < j, при которых nums[i] + nums[j] = sum и sum < k. Если не существует таких i и j, удовлетворяющих этому условию, верните -1. Пример: Input: nums = [34,23,1,24,75,33,54,8], k = 60 Output: 58 Explanation: We can use 34 and 24 to sum 58 which is less than 60. 👨💻 Алгоритм: 1⃣Отсортируйте массив. 2⃣Установите указатели: левый на начало массива, правый на конец. 3⃣Пока левый указатель меньше правого: Если сумма элементов по указателям меньше k, обновите максимальную сумму и сдвиньте левый указатель вправо. Иначе сдвиньте правый указатель влево. Верните максимальную сумму. 😎 Решение: public class Solution { public int TwoSumLessThanK(int[] nums, int k) { int answer = -1; int[] count = new int[1001]; foreach (int num in nums) { count[num]++; } int lo = 1, hi = 1000; while (lo = k || count[hi] == 0) { hi--; } else { if (count[lo] > (lo < hi ? 0 : 1)) { answer = Math.Max(answer, lo + hi); } lo++; } } return answer; } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаЗадача: 1278. Palindrome Partitioning III Сложность: hard Вам дана строка s, содержащая строчные буквы, и целое число k. Вам нужно: Сначала заменить некоторые символы s на другие строчные английские буквы. Затем разделить s на k непустых непересекающихся подстрок так, чтобы каждая подстрока была палиндромом. Верните минимальное количество символов, которое нужно изменить, чтобы разделить строку. Пример: Input: s = "abc", k = 2 Output: 1 👨💻 Алгоритм: 1⃣Используйте динамическое программирование для вычисления количества изменений, необходимых для превращения любой подстроки в палиндром. 2⃣Используйте еще одно динамическое программирование для разбиения строки на k палиндромических подстрок с минимальным количеством изменений. 3⃣Верните минимальное количество изменений, найденное во втором шаге. 😎 Решение: public class Solution { public int MinChangesToMakePalindrome(string s, int k) { int n = s.Length; int MinChangeToPalindrome(string s, int i, int j) { int changes = 0; while (i < j) { if (s[i] != s[j]) { changes++; } i++; j--; } return changes; } int[,] dp1 = new int[n, n]; for (int length = 1; length
Открыть канал и посмотреть медиаOnly registered users can share their opinion.
Be the first to share your impression of this resource!