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
Time: O(nlog(m))
Space: O(1)
1⃣ Устанавливаем границы l и r по краям матрицы: на первый и последний столбец2⃣ Запускаем цикл, пока l <= r:➖ вычисляем средний столбец mid и для него находим строку с максимальным элементом➖ сравниваем максимум с горизонтальными соседями:▫ если он больше левого и правого — возвращаем найденный пик▫ если левый больше: r = mid - 1▫ если правый больше: l = mid + 1
Представь рельеф местности, ты стоишь на самом высоком холме среди всех спереди и сзади, но видишь, что слева или справа есть более высокая точка. Тогда логично идти туда — рано или поздно ты доберёшься до вершины, у которой нет более высоких соседей
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
81. Search in Rotated Sorted Array II
Company:
Вернуть true, если target находится в nums
#leetcode81 | #medium #binarysearch
Please open Telegram to view this post
VIEW IN TELEGRAM
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