92. Reverse Linked List II
Company:
#leetcode92 | #medium #linkedlist
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(1)
[left, right], поэтому ведем подсчет узлов (n) и, если n стал равен left, применяем данный алгоритм, пока n меньше rightn < left, ведем вспомогательный узел dummy, который остановится прямо перед leftdummy, теперь можно выставить нужные ссылки — узел left ссылаем на следующий после right: dummy.next.next = curr, а узел перед left ссылаем на right: dummy.next = prevleft > 1, иначе dummy.next, так как голова списка в таком случае также будет измененаPlease open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Пример:
head = [1,2,3,4,5], left = 2, right = 4#figure #linkedlist
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Теперь доступен отдельный канал JA Roadmap c полной навигацией по всем задачам.
В нем можно очень удобно повторять нужные темы, сразу переходя к постам.
Вскоре еще добавится полная RoadMap по самым нужным задачам для прохождения собеседования, а также топ задач в конкретные компании
Не пропускайте
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
148. Sort List
Company:
#leetcode148 | #medium #linkedlist
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(nlogn)
Space: O(logn)
private ListNode getMid(ListNode head) {
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
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