23. Merge k Sorted Lists
Company:
Объедините все списки в один отсортированный и верните его
#leetcode23 | #hard #linkedlist
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(nlogk)
Space: O(1)
O(nk), что не так хорошоstep, пока данный шаг меньше длины массиваstep равен 1, то есть мы соединяем только текущий и следующий список: merge(list[i], list[i + step]), но далее — после каждого прохода по массиву, мы увеличиваем его в два раза, чтобы объединять уже более длинные промежуточные списки i прохода по массиву должен быть в два раза больше step, чтобы “переступать” через уже объединенные списки, не затрагивая их повторно logk раз и в итоге мы получаем сложность O(nlogk) Please open Telegram to view this post
VIEW IN TELEGRAM
25. Reverse Nodes in k-Group
Company:
Если число узлов не кратно k, то оставшиеся узлы оставьте в том же порядке
#leetcode25 | #hard #linkedlist
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(1)
getKNode, которая возвращает k-й узел от начала текущей группы. Если такой узел существует, значит группа полная и её можно перевернуть знакомым алгоритмомkNode.next и используем его как начальное значение для prev, чтобы сразу соединить текущую группу с оставшейся частью спискаprevPart.next = kNode, затем сдвигаем prevPart к концу текущей уже перевёрнутой группыPlease open Telegram to view this post
VIEW IN TELEGRAM
Представь, что кто-то загадал число от 1 до 100, и ты пытаешься его угадать, задавая вопросы: "твоё число больше этого?" или "меньше?".
Самый быстрый способ это сделать — каждый раз отбрасывать половину возможных вариантов. Для этого нужно начать с середины диапазона — с числа 50.
Спрашиваешь: "Твоё число больше 50?":
Теперь снова берёшь середину нового диапазона — например, 75, и повторяешь. С каждым вопросом ты уменьшаешь количество возможных вариантов в два раза и быстро приближаешься к загаданному числу.
Это и есть бинарный поиск — на каждом шаге ты делишь оставшийся диапазон пополам и выбираешь нужную половину в зависимости от условия. Важно помнить, что такой подход работает только с отсортированными данными, без этого алгоритм не сможет правильно сузить область поиска.
Пример кода бинарного поиска заданного числа target в массиве (задача):
class Solution {
public int search(int[] nums, int target) {
int l = 0, r = nums.length - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return -1;
}
}l + (r - l) / 2, вместо привычного (l + r) / 2. Это нужно для того, чтобы избежать переполнения int при больших значениях l и r.#binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
35. Search Insert Position
Company:
Вам необходимо написать алгоритм со сложностью O(logn) по времени
#leetcode35 | #easy #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(logn)
Space: O(1)
nums[mid] < target: значит target должен быть правее, поэтому сдвигаем левую границу: l = mid + 1r = mid – 1l указывает на позицию вставки:Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
69. Sqrt(x)
Company:
Не допускается использование встроенных функций
#leetcode69 | #easy #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(logx)
Space: O(1)
l = 2, r = x / 2, так как квадратный корень числа x точно не больше x / 2 (если x > 1)square = (long) mid * mid, используя приведение к long, чтобы избежать переполненияsquare == x, найден точный корень — сразу возвращаем midsquare < x, ищем большее значение, сдвигая левую границу: l = mid + 1square > x, ищем меньшее значение, сдвигая правую границу: r = mid - 1l будет указывать на первое число, квадрат которого превышает x, поэтому нужный результат — l - 1, то есть нужный по условию округлённый вниз квадратный кореньPlease open Telegram to view this post
VIEW IN TELEGRAM
1539. Kth Missing Positive Number
Company:
Верните k-ое пропущенное число в этом массиве
#leetcode1539 | #easy #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(logn)
Space: O(1)
[2, 3, 4, 7, 11] с массивом без отсутствующих чисел: [1, 2, 3, 4, 5]. Количество отсутствующих целых чисел — это простая разница между соответствующими элементами этих двух массивов: 2 - 1 = 1 7 - 4 = 311 - 5 = 6То есть, получаем формулу:
arr[i] – (i + 1)l = mid + 1r = mid - 1l = r + 1. Это означает, что на позиции r пропущено меньше, чем k чисел, а на l позиции — k или больше. То есть, k-е пропущенное число находится между arr[r] и arr[l]missed = arr[r] - (r + 1), значит k- е число равно: arr[r] + (k - missed).В итоге получаем такой ответ:
arr[r] + k - (arr[r] - r - 1) = k + r + 1 = k + lPlease open Telegram to view this post
VIEW IN TELEGRAM
540. Single Element in a Sorted Array
Company:
Верните элемент, который встречается только один раз. Реализуйте решение за O(logn) по времени и O(1) по памяти
#leetcode540 | #medium #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(logn)
Space: O(1)
mid может попасть как на первый элемент пары, так и на второй, поэтому важно уметь правильно определять границы левой и правой частей массиваmid сдвигаем его на позицию вперед, если там такой же элементmid имеет пару слева, иначе сразу возвращаем ответ, а затем вычисляем длину подмассива (mid – l + 1):r = mid – 1l = mid + 1Please open Telegram to view this post
VIEW IN TELEGRAM
2560. House Robber IV
Company:
Способность грабителя — это максимальная сумма, которую он способен украсть из одного дома.
Верните минимальную способность грабителя, чтобы бы он смог ограбить k домов
#leetcode2560 | #medium #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(nlogm)
Space: O(1)
l, как минимальное значение массива, а правую r, как максимальноеl ответ на задачуPlease open Telegram to view this post
VIEW IN TELEGRAM
❤1
2226. Maximum Candies Allocated to K Children
Company:
Нужно раздать конфеты k детям так, чтобы каждый получил одинаковое количество. Каждому ребенку можно дать конфеты только из одной части кучи, при этом некоторые кучи могут остаться неиспользованными.
Верните максимальное количество конфет, которое может получить каждый ребенок
#leetcode2226 | #medium #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(nlogm)
Space: O(1)
🟦 Вместо того чтобы пытаться "оптимально" делить кучи, предположим, что мы будем раздавать по x конфет каждому ребёнку. Теперь главный вопрос – это “Можно ли выдать x конфет k детям?”. Чтобы это проверить, достаточно пройти по исходному массиву и брать максимальное количество порций по x из каждой кучи, а затем сравнить их общее количество c k
l — 1 самая маленькая порция и r — максимальное значение candies:Please open Telegram to view this post
VIEW IN TELEGRAM
2300. Successful Pairs of Spells and Potions
Company:
Пара заклинания и зелья считается успешной, если произведение их сил составляет не менее заданного числа success.
Верните целочисленный массив answer, где answer[i] — количество зелий, которые составят успешную пару с заклинанием spells[i]
#leetcode2300 | #medium #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Time: O(nlogm)
Space: O(1)
r = mid – 1l = mid + 1l указывает на первую подходящую позицию и количество успешных пар для текущего заклинания вычисляется, как potions.length - l. Повторяя это для каждого элемента из spells, мы формируем итоговый массив с ответамиPlease open Telegram to view this post
VIEW IN TELEGRAM
1901. Find a Peak Element II
Company:
Пиковый элемент в матрице — это элемент, который строго больше всех своих соседних: слева, справа, сверху и снизу. Можно предположить, что вся матрица окружена внешним периметром со значением -1 в каждой ячейке.
Вам необходимо написать алгоритм, который будет работать за время O(m log(n)) или O(n log(m))
#leetcode1901 | #medium #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM