Time: O(n)
Space: O(1)
🟦 Используя указатели бинарного поиска, можно определить какая часть массива является полностью отсортированной, а затем двигаться в сторону, где потенциально находится target. Однако из-за возможных повторяющихся элементов возникает неоднозначность, которую необходимо обрабатывать отдельно
l вперед и пропускаем этот шаг цикла. При этом nums[l] точно не равен target, так как мы вернули бы true раньше, поэтому можно смело исключать данный элемент из рассмотренияr = mid - 1l = mid + 1Please open Telegram to view this post
VIEW IN TELEGRAM
410. Split Array Largest Sum
Company:
Верните минимальную наибольшую сумму разделения
#leetcode410 | #hard #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(nlog(s))
Space: O(1)
l = mid + 1 r = mid – 1. При этом, если получили меньше k частей — это не проблема, так как можно дополнительно разделить любую частьl окажется наименьшая возможная максимальная сумма подмассива, при которой можно разбить массив на k частейPlease open Telegram to view this post
VIEW IN TELEGRAM
1231. Divide Chocolate
Company:
Вы хотите поделить шоколад на k + 1 частей, разрезав плитку k раз, при этом вы забираете себе наименее сладкий из полученных кусков. Ваша цель — максимизировать сладость этой наименьшей части, которую вы себе оставите.
Найдите максимальную общую сладость кусочка, которую вы можете получить, оптимально разрезав плитку шоколада
#leetcode1231 | #hard #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(nlog(s))
Space: O(1)
count >= k + 1, значит можно разделить массив с такой минимальной сладостью — сохраняем результат и пробуем его улучшить: l = mid + 1 r = mid – 1Please open Telegram to view this post
VIEW IN TELEGRAM
4. Median of Two Sorted Arrays
Company:
Напишите алгоритм со временем работы не хуже O(log (m+n))
#leetcode4 | #hard #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(log(min(n,m)))
Space: O(1)
Очевидно, все элементы перед медианой — меньше или равны, все элементы после — больше или равны
Если мы вычислим mid1 — количество элементов из первого массива, попадающих в левую половину, то тем самым определим границу между левой и правой частями в первом массиве. Конец левой части будет элемент nums1[mid1 - 1], начало правой — nums1[mid1]
На самом деле, нам не нужно искать её бинарным поиском. Мы уже знаем, сколько всего элементов должно быть в левой половине — half. А значит, если мы взяли mid1 из первого массива, то из второго остаётся взять mid2 = half - mid1. Это и будет количество элементов из второго массива в левой части
▫ Почему r = n1, а не n1 – 1?
Потому что мы ведём бинарный поиск не по индексам, а по количеству элементов, которые нужно взять из первого массива в левую часть объединённого массива▫ Почему half = (n1 + n2 + 1) /2, а не (n1 + n2) / 2?
Это делается для корректного определения количества элементов в левой половине в случае, когда общее количество элементов нечётное▫ Зачем в начале условие if (nums1.length > nums2.length)...?
Данное условие используется для обработки случая, когда один из массивов пустой, а также предотвращает отрицательные значения mid2 и гарантирует, что бинарный поиск будет выполняться по меньшему массиву, что делает алгоритм устойчивым и эффективным
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Пример:
nums1 = [1,2,3,4,5], nums2 = [1,2,3,4,5,6,7]#figure #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
Бинарные деревья широко используются для хранения, обработки и обхода данных, таких как выражения, файловые системы или структура HTML-страниц. Например: дерево принятия решений в игре (если "нет" — налево, если "да" — направо).
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}Такое упорядочивание позволяет быстро искать, добавлять и удалять значения.
#binarytree
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Рекурсия — это когда функция вызывает сама себя, чтобы решить задачу по частям.
Ты повторяешь одно и то же действие, уменьшая оставшийся объём работы. При этом обязательно должно быть условие остановки, иначе будешь снимать носки вечно 😄.
Каждый раз, когда функция вызывает саму себя, программа:
Затем программа начинает извлекать задачи из стека, в обратном порядке, и на каждом шаге сохраняет и возвращает результат.
public static int factorial(int n) {
if (n == 1) return 1; // базовый случай
return n * factorial(n - 1); // рекурсивный шаг
}
factorial(3)
→ 3 * factorial(2)
→ 3 * (2 * factorial(1))
→ 3 * (2 * 1) = 6#recursion
Please open Telegram to view this post
VIEW IN TELEGRAM
101. Symmetric Tree
Company:
Верните true, если оно является зеркальным отражением самого себя, то есть симметричным относительно своего центра
#leetcode101 | #easy #binarytree
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(n)
Please open Telegram to view this post
VIEW IN TELEGRAM
404. Sum of Left Leaves
Company:
Лист — это узел без потомков. Левый лист — это лист, который является левым потомком другого узла
#leetcode404 | #easy #binarytree
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(h)
Please open Telegram to view this post
VIEW IN TELEGRAM
270. Closest Binary Search Tree Value
Company:
Верните значение в BST, которое ближе всего к target. Если есть несколько ответов, верните наименьший
#leetcode270 | #easy #binarytree
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(h)
Space: O(1)
Please open Telegram to view this post
VIEW IN TELEGRAM
863. All Nodes Distance K in Binary Tree
Company:
Верните список значений всех узлов (в любом порядке), которые находятся на расстоянии k от целевого узла
#leetcode863 | #medium #binarytree
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Time: O(n)
Space: O(n)
В итоге получаем эффективный алгоритм за O(n)
Please open Telegram to view this post
VIEW IN TELEGRAM
314. Binary Tree Vertical Order Traversal
Company:
Если два узла находятся в одной строке и столбце, порядок должен быть слева направо
#leetcode314 | #medium #binarytree
Please open Telegram to view this post
VIEW IN TELEGRAM
Time: O(n)
Space: O(n)
В реализации bfs используем очередь Queue<Pair>, где Pair — это структура, содержащая сам узел и его номер столбца. Каждый раз, когда мы извлекаем узел из очереди, мы добавляем его значение в список соответствующего столбца в HashMap и помещаем в очередь его левого и правого детей с обновлёнными номерами столбцов.
private static class Pair {
TreeNode node;
int column;
public Pair(TreeNode node, int column) {
this.node = node;
this.column = column;
}
}
Это позволяет в конце пройти по столбцам от самого левого до самого правого, добавляя значения из HashMap в итоговый список в нужном порядке
Please open Telegram to view this post
VIEW IN TELEGRAM
99. Recover Binary Search Tree
Company:
Восстановите дерево, вернув узлам правильные значения
#leetcode99 | #medium #binarytree
Please open Telegram to view this post
VIEW IN TELEGRAM