Python | LeetCode
الذهاب إلى القناة على Telegram
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+20tRfhrwPpM4NDQy Вопросы собесов t.me/+cnJC0_ZeZ_I0OGY6 Вакансии t.me/+cXGKkrOY2-w3ZTky
إظهار المزيد9 410
المشتركون
+324 ساعات
-57 أيام
-6230 أيام
أرشيف المشاركات
9 410
Задача: 1337. The K Weakest Rows in a Matrix
Сложность: easy
Вам дана бинарная матрица размером m x n mat, состоящая из 1 (представляющих солдат) и 0 (представляющих гражданских лиц). Солдаты расположены перед гражданскими лицами. То есть, все 1 будут расположены слева от всех 0 в каждой строке.
Строка i слабее строки j, если выполнено одно из следующих условий:
Количество солдат в строке i меньше, чем в строке j.
Обе строки имеют одинаковое количество солдат, но i < j.
Верните индексы k самых слабых строк в матрице, упорядоченных от самой слабой к самой сильной.
Пример:
Input: mat =
[[1,1,0,0,0],
[1,1,1,1,0],
[1,0,0,0,0],
[1,1,0,0,0],
[1,1,1,1,1]],
k = 3
Output: [2,0,3]
Explanation:
The number of soldiers in each row is:
- Row 0: 2
- Row 1: 4
- Row 2: 1
- Row 3: 2
- Row 4: 5
The rows ordered from weakest to strongest are [2,0,3,1,4].
👨💻 Алгоритм:
1⃣Вычислите силу каждой строки матрицы и поместите пары сила/индекс в массив. Для каждой строки подсчитайте количество единиц (солдат) до первой нуля (гражданского), чтобы определить силу строки.
2⃣Отсортируйте массив пар по возрастанию силы, а в случае равенства силы — по возрастанию индекса. Для этого потребуется реализовать компаратор, который сравнивает сначала силу, а затем индекс.
3⃣Извлеките первые k индексов из отсортированного массива и верните их. Эти индексы будут соответствовать k самым слабым строкам в порядке от самой слабой к самой сильной.
😎 Решение:
class Solution:
def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:
m = len(mat)
n = len(mat[0])
pairs = []
for i in range(m):
strength = 0
for j in range(n):
if mat[i][j] == 0:
break
strength += 1
pairs.append((strength, i))
pairs.sort()
indexes = [pairs[i][1] for i in range(k)]
return indexes
Ставь 👍 и забирай 📚 Базу знаний9 410
Задача: 381. Insert Delete GetRandom O(1) - Duplicates allowed
Сложность: hard
RandomizedCollection — это структура данных, содержащая набор чисел, возможно с дубликатами (т.е. мультимножество). Она должна поддерживать вставку и удаление определенных элементов, а также предоставление случайного элемента.
Реализуйте класс RandomizedCollection:
RandomizedCollection(): Инициализирует пустой объект RandomizedCollection.
bool insert(int val): Вставляет элемент val в мультимножество, даже если элемент уже присутствует. Возвращает true, если элемента не было, и false в противном случае.
bool remove(int val): Удаляет элемент val из мультимножества, если он присутствует. Возвращает true, если элемент присутствовал, и false в противном случае. Если у val несколько вхождений в мультимножестве, удаляется только одно из них.
int getRandom(): Возвращает случайный элемент из текущего мультимножества. Вероятность возврата каждого элемента пропорциональна числу вхождений этого элемента в мультимножество.
Реализуйте функции класса так, чтобы каждая функция работала в среднем за O(1) времени.
Пример:
Input ["RandomizedCollection", "insert", "insert", "insert", "getRandom", "remove", "getRandom"] [[], [1], [1], [2], [], [1], []] Output [null, true, false, true, 2, true, 1]👨💻 Алгоритм: 1⃣Создать словарь для хранения значений и их индексов в списке, а также список для хранения всех элементов мультимножества. 2⃣Метод insert(val): Добавить значение в конец списка и обновить словарь, добавив индекс этого значения. Возвращать true, если значение отсутствовало ранее, и false в противном случае. Метод remove(val): Удалить одно вхождение значения из словаря и списка. Для удаления значения заменить его последним элементом списка и обновить словарь. Возвращать true, если значение присутствовало, и false в противном случае. 3⃣Метод getRandom(): Возвращать случайный элемент из списка, обеспечивая равновероятное распределение на основе количества вхождений каждого элемента. 😎 Решение:
import random
from collections import defaultdict
class RandomizedCollection:
def __init__(self):
self.dict = defaultdict(set)
self.list = []
def insert(self, val: int) -> bool:
self.dict[val].add(len(self.list))
self.list.append(val)
return len(self.dict[val]) == 1
def remove(self, val: int) -> bool:
if not self.dict[val]:
return False
index = self.dict[val].pop()
last_element = self.list[-1]
self.list[index] = last_element
self.dict[last_element].add(index)
self.dict[last_element].discard(len(self.list) - 1)
self.list.pop()
if not self.dict[val]:
del self.dict[val]
return True
def getRandom(self) -> int:
return random.choice(self.list)
Ставь 👍 и забирай 📚 Базу знаний9 410
Задача: 1238. Circular Permutation in Binary Representation
Сложность: medium
Даны 2 целых числа n и start. Ваша задача - вернуть любую перестановку p из (0,1,2.....,2^n -1) такую, что : p[0] = start p[i] и p[i+1] отличаются только одним битом в их двоичном представлении. p[0] и p[2^n -1] также должны отличаться только одним битом в их двоичном представлении.
Пример:
Input: n = 2, start = 3 Output: [3,2,0,1]👨💻 Алгоритм: 1⃣Генерация Грей-кода: Генерация Грей-кода для чисел от 0 до 2𝑛−1 2⃣Определение начальной позиции: Находим индекс числа start в последовательности Грей-кода. 3⃣Построение перестановки: Формируем перестановку, начиная с числа start и следуя по циклическому Грей-коду. 😎 Решение:
def grayCode(n):
return [i ^ (i >> 1) for i in range(1 << n)]
def circularPermutation(n, start):
gray = grayCode(n)
start_index = gray.index(start)
return gray[start_index:] + gray[:start_index]
Ставь 👍 и забирай 📚 Базу знаний9 410
SOC Forum 2025 онлайн — все профи ИБ в одном месте
📅 18–20 ноября пройдет ключевое событие
Недели кибербезопасности — SOC Forum.
👍 Ведущие эксперты соберутся, чтобы обсудить самые острые темы и представить лучшие практические кейсы: каждый доклад прошел строгий отбор, так что вас ждет концентрат пользы.
⚡ Станьте частью форума даже онлайн!
Помимо прямой трансляции лекций, для удаленных участников будут работать «Кибербез ТВ» и радиостанция «ЭХО лОСЕЙ» — с новостными дайджестами, эксклюзивными интервью, мастер-классами и специальными сюжетами, доступными только в онлайн-формате.
✅ Зарегистрируйтесь, и мы пришлем напоминание перед стартом.
Зарегистрироваться
#реклама 16+
registration.forumsoc.ru
О рекламодателе
9 410
Задача: 217. Contains Duplicate
Сложность: easy
Дан массив целых чисел nums. Верните true, если любое значение появляется в массиве хотя бы дважды, и верните false, если каждый элемент уникален.
Пример:
Input: nums = [1,2,3,4] Output: false👨💻 Алгоритм: 1️⃣Отсортируйте массив nums по возрастанию. 2️⃣Итерируйте по отсортированному массиву и сравнивайте каждое число с следующим. 3️⃣Если любое число совпадает с следующим, верните true. Если цикл завершится без совпадений, верните false. 😎 Решение:
def containsDuplicate(nums):
nums.sort()
for i in range(len(nums) - 1):
if nums[i] == nums[i + 1]:
return True
return False
Ставь 👍 и забирай 📚 Базу знаний9 410
Задача: 268. Missing Number
Сложность: easy
Дан массив nums, содержащий n различных чисел в диапазоне [0, n]. Верните единственное число в этом диапазоне, которого нет в массиве.
Пример:
Input: nums = [3,0,1] Output: 2 Explanation: n = 3 since there are 3 numbers, so all numbers are in the range [0,3]. 2 is the missing number in the range since it does not appear in nums.👨💻 Алгоритм: 1️⃣Сначала отсортируйте массив nums. 2️⃣Проверьте особые случаи: убедитесь, что число 0 находится в начале массива, а число n — в конце. 3️⃣Пройдитесь по отсортированному массиву и для каждого индекса проверьте, что число на этом индексе соответствует ожидаемому (предыдущее число плюс один). Как только вы обнаружите несоответствие, верните ожидаемое число. 😎 Решение:
class Solution:
def missingNumber(self, nums):
nums.sort()
if nums[-1] != len(nums):
return len(nums)
elif nums[0] != 0:
return 0
for i in range(1, len(nums)):
expected_num = nums[i - 1] + 1
if nums[i] != expected_num:
return expected_num
return -1
Ставь 👍 и забирай 📚 Базу знаний9 410
Станьте разработчиком нейро-сотрудников на Python и зарабатывайте от 150.000р в месяц 🔥🔥🔥
Мы научим вас создавать топовых нейро-сотрудников на базе GPT-4 Omni, и вы сможете:
1️⃣ Устроиться разработчиком в крупную компанию и зарабатывать от 150 тысяч ₽ в месяц
2️⃣ Разрабатывать такие проекты на заказ и зарабатывать от 500 тысяч ₽ за проект
3️⃣ Создать нейро-сотрудника в вашей компании и вырасти на +30-100% в зарплате
Что будет на интенсиве?
🧬 Теория: как создаются нейро-сотрудники с GPT-4o на Python
🧬 Практика: мы создадим нейро-консультанта, нейро-HR, нейро-маркетолога и др.
Ведущий интенсива - Senior AI разработчик нейросетей и основатель Университета искусственного интеллекта
🔥 Регистрируйтесь на бесплатный интенсив! Встречаемся в ближайший четверг!
9 410
Реклама для бизнеса любого уровня в Яндекс Директе
Создайте эффективную рекламную кампанию с алгоритмами Яндекс Директа 👌
Начните прямо сейчас ⚡
Зарегистрироваться
#реклама
direct.yandex.ru
О рекламодателе
9 410
Задача: 112. Path Sum
Сложность: easy
Дан корень бинарного дерева и целое число targetSum. Верните true, если в дереве существует путь от корня до листа, такой, что сумма всех значений вдоль пути равна targetSum.
Лист — это узел без детей.
Пример:
Input: root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22 Output: true Explanation: The root-to-leaf path with the target sum is shown.👨💻 Алгоритм: 1️⃣Инициализация стека: Начать с помещения в стек корневого узла и соответствующей оставшейся суммы, равной sum - root.val. 2️⃣Обработка узлов: Извлечь текущий узел из стека и вернуть True, если оставшаяся сумма равна 0 и узел является листом. 3️⃣Добавление дочерних узлов в стек: Если оставшаяся сумма не равна нулю или узел не является листом, добавить в стек дочерние узлы с соответствующими оставшимися суммами. 😎 Решение:
class Solution:
def hasPathSum(self, root: TreeNode, sum: int) -> bool:
if not root:
return False
de = [
(root, sum - root.val),
]
while de:
node, curr_sum = de.pop()
if not node.left and not node.right and curr_sum == 0:
return True
if node.right:
de.append((node.right, curr_sum - node.right.val))
if node.left:
de.append((node.left, curr_sum - node.left.val))
return False
Ставь 👍 и забирай 📚 Базу знаний9 410
Запустите рекламу в телеграм-каналах с Яндекс Директом
Перфоманс-реклама теперь в телеграм-каналах ⚡
Яндекс Директ знает, как привлечь целевую аудиторию 💰👌
Попробовать
#реклама
yandex.ru
О рекламодателе
9 410
Задача: 736. Parse Lisp Expression
Сложность: hard
Нам дан массив asteroids, состоящий из целых чисел, представляющих астероиды в ряд. Для каждого астероида абсолютное значение обозначает его размер, а знак - направление движения (положительное - вправо, отрицательное - влево). Каждый астероид движется с одинаковой скоростью. Определите состояние астероидов после всех столкновений. Если два астероида столкнутся, меньший из них взорвется. Если оба одинакового размера, то взорвутся оба. Два астероида, движущиеся в одном направлении, никогда не встретятся.
Пример:
Input: expression = "(let x 2 (mult x (let x 3 y 4 (add x y))))" Output: 14👨💻 Алгоритм: 1⃣Определите функцию для оценки выражений. 2⃣Используйте рекурсивный подход для обработки различных типов выражений (let, add, mult, и переменных). 3⃣Используйте словарь для отслеживания значений переменных с учетом области видимости. 😎 Решение:
class Solution:
def evaluate(self, expression: str) -> int:
def evaluate(expression, env):
if expression[0] != '(':
if expression[0].isalpha():
return env[expression]
return int(expression)
tokens = tokenize(expression)
if tokens[0] == 'let':
for i in range(1, len(tokens) - 2, 2):
env[tokens[i]] = evaluate(tokens[i + 1], env)
return evaluate(tokens[-1], env)
elif tokens[0] == 'add':
return evaluate(tokens[1], env) + evaluate(tokens[2], env)
elif tokens[0] == 'mult':
return evaluate(tokens[1], env) * evaluate(tokens[2], env)
def tokenize(expression):
tokens, token, parens = [], '', 0
for char in expression:
if char == '(':
parens += 1
if parens == 1:
continue
elif char == ')':
parens -= 1
if parens == 0:
tokens.append(tokenize(token))
token = ''
continue
elif char == ' ' and parens == 1:
if token:
tokens.append(token)
token = ''
continue
token += char
if token:
tokens.append(token)
return tokens
return evaluate(expression, {})
Ставь 👍 и забирай 📚 Базу знаний9 410
REKONFA Live
6 ноября приглашаем всех, кто имеет отношение к маркетингу и рекламным технологиям, обсудить рынок, тренды, вызовы и их решения.
С докладами на актуальные темы выступят лидеры индустрии и медийные спикеры.
Принять участие можно офлайн и онлайн. Мероприятие бесплатное, нужно только зарегистрироваться.
Зарегистрироваться
#реклама 18+
ya.rekonfa.ru
О рекламодателе
9 410
Задача: 1357. Apply Discount Every n Orders
Сложность: medium
В супермаркете, который посещает множество покупателей, товары представлены двумя параллельными массивами целых чисел products и prices, где i-й товар имеет идентификатор products[i] и цену prices[i].
Когда покупатель оплачивает товар, его счет представлен двумя параллельными массивами целых чисел product и amount, где j-й приобретенный товар имеет идентификатор product[j], а amount[j] - количество купленного товара. Их промежуточный итог рассчитывается как сумма каждого amount[j] * (цена j-го товара).
Супермаркет решил провести распродажу. Каждому n-му покупателю, оплачивающему свои покупки, будет предоставлена скидка в процентах. Сумма скидки задается параметром discount, и покупатель получит скидку в discount процентов от своего промежуточного итога. Формально, если их промежуточный итог составляет bill, то они фактически заплатят bill * ((100 - discount) / 100).
Реализуйте класс Cashier:
Cashier(int n, int discount, int[] products, int[] prices): инициализирует объект с параметрами n, discount, а также массивами товаров и их цен.
double getBill(int[] product, int[] amount): возвращает итоговую сумму счета с примененной скидкой (если применима). Ответы, отличающиеся от фактического значения не более чем на 10^-5, будут приняты.
Пример:
Input ["Cashier","getBill","getBill","getBill","getBill","getBill","getBill","getBill"] [[3,50,[1,2,3,4,5,6,7],[100,200,300,400,300,200,100]],[[1,2],[1,2]],[[3,7],[10,10]],[[1,2,3,4,5,6,7],[1,1,1,1,1,1,1]],[[4],[10]],[[7,3],[10,10]],[[7,5,3,1,6,4,2],[10,10,10,9,9,9,7]],[[2,3,5],[5,3,2]]] Output [null,500.0,4000.0,800.0,4000.0,4000.0,7350.0,2500.0]👨💻 Алгоритм: 1⃣Инициализация объекта: Создайте класс Cashier с конструктором, который принимает параметры n, discount, products и prices. В конструкторе инициализируйте необходимые переменные и создайте словарь для сопоставления идентификаторов продуктов с их ценами. 2⃣Обработка каждого счета: Создайте метод getBill, который принимает массивы product и amount. Вычислите промежуточный итог счета, умножая количество каждого продукта на его цену и суммируя результаты. Увеличьте счетчик клиентов. Если клиент является n-м по счету, примените скидку к промежуточному итогу. 3⃣Верните итоговую сумму счета. 😎 Решение:
class Cashier:
def __init__(self, n: int, discount: int, products: List[int], prices: List[int]):
self.n = n
self.discount = discount
self.productsPrices = dict(zip(products, prices))
self.customerCount = 0
def getBill(self, product: List[int], amount: List[int]) -> float:
self.customerCount += 1
bill = sum(self.productsPrices[prod] * amt for prod, amt in zip(product, amount))
if self.customerCount % self.n == 0:
bill *= (100 - self.discount) / 100.0
return bill
Ставь 👍 и забирай 📚 Базу знаний9 410
Задача: 303. Range Sum Query - Immutable
Сложность: easy
Дан целочисленный массив nums. Обработайте несколько запросов следующего типа:
Вычислите сумму элементов массива nums между индексами left и right включительно, где left <= right.
Реализуйте класс NumArray:
- NumArray(int[] nums) Инициализирует объект с целочисленным массивом nums.
- int sumRange(int left, int right) Возвращает сумму элементов массива nums между индексами left и right включительно (т.е. nums[left] + nums[left + 1] + ... + nums[right]).
Пример:
Input ["NumArray", "sumRange", "sumRange", "sumRange"] [[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]] Output [null, 1, -1, -3]👨💻 Алгоритм: 1⃣Инициализация: Создайте массив sum длиной на один элемент больше, чем массив nums, и заполните его накопленными суммами элементов массива nums. 2⃣Предварительное вычисление сумм: Заполните массив sum, где каждый элемент sum[i + 1] является суммой всех предыдущих элементов массива nums до индекса i включительно. 3⃣Вычисление диапазонной суммы: Для каждого запроса суммы элементов между индексами left и right используйте разницу между sum[right + 1] и sum[left], чтобы быстро получить результат. 😎 Решение:
class NumArray:
def __init__(self, nums: List[int]):
self.sum = [0] * (len(nums) + 1)
for i in range(len(nums)):
self.sum[i + 1] = self.sum[i] + nums[i]
def sumRange(self, i: int, j: int) -> int:
return self.sum[j + 1] - self.sum[i]
Ставь 👍 и забирай 📚 Базу знаний9 410
+4
Старт продаж премиальных апартаментов Skysoul в Крыму
Премиальный комплекс в 30 метрах от собственного пляжа
✅ Комплекс — 4-х кратный победитель премии в сфере недвижимости URBAN AWORDS как самый привлекательный инвестиционный проект ЮФО
🏠 Комплекс можно:
- Сдавать посуточно через отельера международного класса и получать пассивный ежемесячный доход (при этом отдыхая в отпуске в собственном номере)
- Выгодно перепродать
⚡ О проекте:
- Первая береговая линия – всего в 30 метрах расположен собственный пляж
- На территории открытый и 2 круглогодичных бассейна
- Более 14,5 га впечатляющей территории: 4-этажный SPA-комплекс, амфитеатр, панорамный ресторан, медцентр, игровое пространство для детей, магазины и бутик
⚡Роскошные панорамные виды на потухший вулкан, море и виноградники
✅Получите цены и презентацию первыми:
Перейти на сайт
Проектная декларация на сайте https://наш.дом.рф/.
#реклама
mrqz.me
О рекламодателе
9 410
Задача: 754. Reach a Number
Сложность: medium
Вы стоите в позиции 0 на бесконечной числовой прямой. В позиции target находится пункт назначения. Вы можете сделать некоторое количество ходов numMoves так, чтобы: на каждом ходу вы могли пойти либо налево, либо направо. Во время i-го хода (начиная с i == 1 до i == numMoves) вы делаете i шагов в выбранном направлении. Учитывая целое число target, верните минимальное количество ходов (т.е. минимальное numMoves), необходимое для достижения пункта назначения.
Пример:
Input: target = 2 Output: 3👨💻 Алгоритм: 1⃣Инициализируйте переменную для текущей позиции (position) и счетчик шагов (steps). 2⃣Используйте цикл, чтобы добавлять к position текущее количество шагов и увеличивать steps. 3⃣Если position достигает или превышает target и разница между position и target четная, остановите цикл и верните steps. 😎 Решение:
def reachTarget(target):
target = abs(target)
position = 0
steps = 0
while position < target or (position - target) % 2 != 0:
steps += 1
position += steps
return steps
Ставь 👍 и забирай 📚 Базу знаний9 410
ИИ-революция в вашей карьере: бесплатный вебинар
2025 год: нейросети — это must-have навык для карьерного роста. 👌
✅Приглашаем на бесплатный живой вебинар, где вы:
--- Поймете, какие нейросети существуют и как их применять в работе.
--- Научитесь писать эффективные промпты и автоматизировать рутину.
--- Узнаете, как делегировать ИИ задачи и экономить от 20 часов в неделю!
--- Создадите своего первого ИИ-ассистента в прямом эфире.
Получите руководство «Как создать цифровой аватар» сразу после регистрации!
Подойдет новичкам. Онлайн-формат с ответами на вопросы.
⚡ Жмите «Зарегистрироваться», чтобы прокачать свой скилл-сет и освободить время для главного!
Зарегистрироваться
#реклама 16+
ed.bonnieandslide.com
О рекламодателе
9 410
Задача: 234. Palindrome Linked List
Сложность: easy
Дан головной элемент односвязного списка. Верните true, если список является палиндромом, и false в противном случае.
Пример:
Input: head = [1,2,2,1] Output: true👨💻 Алгоритм: 1⃣Копирование односвязного списка в массив: Итеративно пройдите по односвязному списку, добавляя каждое значение в массив. Для этого используйте переменную currentNode, указывающую на текущий узел. На каждой итерации добавляйте currentNode.val в массив и обновляйте currentNode, чтобы он указывал на currentNode.next. Остановите цикл, когда currentNode укажет на null. 2⃣Проверка массива на палиндром: Используйте метод с двумя указателями для проверки массива на палиндром. Разместите один указатель в начале массива, а другой в конце. На каждом шаге проверяйте, равны ли значения, на которые указывают указатели, и перемещайте указатели к центру, пока они не встретятся. 3⃣Сравнение значений: Помните, что необходимо сравнивать значения узлов, а не сами узлы. Используйте node_1.val == node_2.val для сравнения значений узлов. Сравнение узлов как объектов node_1 == node_2 не даст ожидаемого результата. 😎 Решение:
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
vals = []
currentNode = head
while currentNode is not None:
vals.append(currentNode.val)
currentNode = currentNode.next
front = 0
back = len(vals) - 1
while front < back:
if vals[front] != vals[back]:
return False
front += 1
back -= 1
return True
Ставь 👍 и забирай 📚 Базу знаний9 410
Как предотвратить ущерб от 89% кибератак
Хакеры пытаются пройти через DNS, но мы всё видим!
📊 89% кибератак осуществляются через DNS-протоколы. SWG-системы не распознают часть аномалий сразу, и злоумышленники успевают этим воспользоваться.
💻 Solar DNS Radar автоматизирует блокировку фишинга и зараженных доменов, чтобы снизить нагрузку на SOC. А еще замечает уже попавшие внутрь вирусные ПО, незаметно использующие DNS для связи с управляющими серверами.
📅 29 октября эксперты «Солара» проведут онлайн-презентацию сервиса. Расскажут о результатах реальных кейсов и бесплатном тестировании пилота на 1 месяц.
Подключайтесь — Solar DNS Radar подойдет любому бизнесу, а интеграция облачной версии максимально простая и быстрая
✅ Зарегистрируйтесь, и мы отправим вам напоминание о старте трансляции.
Узнать больше
#реклама 16+
rt-solar.ru
О рекламодателе
9 410
Задача: 163. Missing Ranges
Сложность: easy
Вам дан диапазон [lower, upper] и отсортированный массив уникальных целых чисел nums, где все элементы находятся в этом диапазоне.
Число x считается пропущенным, если оно находится в диапазоне [lower, upper] и его нет в массиве nums.
Верните кратчайший отсортированный список диапазонов, который точно покрывает все пропущенные числа. То есть ни один элемент из nums не включен в какой-либо из диапазонов, и каждое пропущенное число покрыто одним из диапазонов..
Пример:
Input: nums = [-1], lower = -1, upper = -1 Output: [] Explanation: There are no missing ranges since there are no missing numbers.👨💻 Алгоритм: 1️⃣Инициализация и проверка начальных условий: Создайте переменную n и инициализируйте её размером массива nums. Создайте список missingRanges, который будет содержать решение задачи. Если массив nums пуст, верните диапазон [lower, upper]. Проверьте, совпадает ли первый элемент массива с lower. Если lower < nums[0], добавьте в missingRanges диапазон [lower, nums[0] - 1]. 2️⃣Итерация по элементам массива: Проитерируйте по всем элементам в nums с помощью цикла от i = 0 до n - 2 (до предпоследнего элемента): Если текущий элемент nums[i] и следующий элемент nums[i + 1] отличаются на 1 или меньше, между этими двумя числами нет пропущенных чисел. В противном случае, если nums[i + 1] - nums[i] > 1, то пропущены числа от nums[i] + 1 до nums[i + 1] - 1 (включительно). В этом случае диапазон [nums[i] + 1, nums[i + 1] - 1] добавляется в missingRanges. 3️⃣Проверка и добавление последнего пропущенного диапазона: Проверьте, совпадает ли последний элемент массива с upper. Если nums[n - 1] < upper, добавьте в missingRanges диапазон [nums[n - 1] + 1, upper]. 😎 Решение:
class Solution:
def findMissingRanges(
self, nums: List[int], lower: int, upper: int
) -> List[List[int]]:
n = len(nums)
missing_ranges = []
if n == 0:
missing_ranges.append([lower, upper])
return missing_ranges
if lower < nums[0]:
missing_ranges.append([lower, nums[0] - 1])
for i in range(n - 1):
if nums[i + 1] - nums[i] <= 1:
continue
missing_ranges.append([nums[i] + 1, nums[i + 1] - 1])
if upper > nums[n - 1]:
missing_ranges.append([nums[n - 1] + 1, upper])
return missing_ranges
Ставь 👍 и забирай 📚 Базу знаний
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
