[Решение 4.1. Разделяй и властвуй] Leetcode #53. Maximum Subarray
Условие задачи: https://yangx.top/leetcode_furrycat/28
Стратегия "Разделяй и властвуй" предполагает деление исходного массива на несколько частей. Мы будем делить на три (левую
- полностью в левой части
- полностью в правой части
- либо включает в себя обязательно центральный элемент
Для L и R мы запустим рекурсивное вычисление. Для третьего случая посчитаем максимальную сумму. Потом сравним три значения и вернем максимальное.
Временная сложность этого решения - ожидаемо O (n * log n). Мы делаем log n разделений и для каждого считаем maxCenterSubArraySum, что требует перебора массива (n).
Пространственная сложность: O (log n) - так как у нас рекурсия.
#medium #arrays #divideandconquer #recursion
@leetcode_furrycat
Условие задачи: https://yangx.top/leetcode_furrycat/28
Стратегия "Разделяй и властвуй" предполагает деление исходного массива на несколько частей. Мы будем делить на три (левую
L
, правую R
и центральный элемент `mid`). Тогда наш искомый подмассив с максимальной суммой может лежать:- полностью в левой части
L
(от 0
до `mid-1`)- полностью в правой части
R
(от mid+1
до `n.length-1`)- либо включает в себя обязательно центральный элемент
mid
и возможно части L
и R
, которые находятся рядом с mid
Для L и R мы запустим рекурсивное вычисление. Для третьего случая посчитаем максимальную сумму. Потом сравним три значения и вернем максимальное.
function getMaxSubArraySum(nums, left, right) {
left = left ?? 0; // начало анализируемого подмассива
right = right ?? nums.length - 1; // конец анализируемого подмассива
if (left > right) return -Infinity;
const mid = Math.floor((left + right) / 2); // середина анализируемого подмассива
// рекурсивно считаем для левой и правой частей
const maxLeftSubArraySum = getMaxSubArraySum(nums, left, mid - 1);
const maxRightSubArraySum = getMaxSubArraySum(nums, mid + 1, right);
// находим подмассив с максимальной суммой,
// который содержит элемент mid
let leftMaxSum = 0;
let rightMaxSum = 0;
// для L идем с конца, так как подмассив должен быть рядом с mid
// считаем непрерывную сумму элементов и отбираем максимальную
for (let i = mid - 1, currentLeftSum = 0; i >= left; i--) {
currentLeftSum += nums[i];
leftMaxSum = Math.max(leftMaxSum, currentLeftSum);
}
// то же для R
for (let i = mid + 1, currentRightSum = 0; i <= right; i++) {
currentRightSum += nums[i];
rightMaxSum = Math.max(rightMaxSum, currentRightSum);
}
const maxCenterSubArraySum = leftMaxSum + nums[mid] + rightMaxSum;
return Math.max(maxLeftSubArraySum, maxRightSubArraySum, maxCenterSubArraySum)
}
Временная сложность этого решения - ожидаемо O (n * log n). Мы делаем log n разделений и для каждого считаем maxCenterSubArraySum, что требует перебора массива (n).
Пространственная сложность: O (log n) - так как у нас рекурсия.
#medium #arrays #divideandconquer #recursion
@leetcode_furrycat
Telegram
Leetcode Challenge
[Условие] Leetcode #53. Maximum Subarray
Ссылка на задачу на Leetcode
Получаем на вход массив целых чисел nums. Необходимо найти подмассив с самой большой суммой элементов. На выходе должна быть сумма элементов подмассива.
Подмассив - это непрерывная и…
Ссылка на задачу на Leetcode
Получаем на вход массив целых чисел nums. Необходимо найти подмассив с самой большой суммой элементов. На выходе должна быть сумма элементов подмассива.
Подмассив - это непрерывная и…
[Решение 4.2. Оптимизация Разделяй и властвуй] Leetcode #53. Maximum Subarray
Условие задачи: https://yangx.top/leetcode_furrycat/28
И наконец, мы можем еще сократить время выполнения алгоритма, заранее посчитав префиксные и суффиксные суммы.
Теперь рассчитать
Временная сложность: O(n)
Пространственная сложность: O(n)
#medium #arrays #divideandconquer #prefixsum
@leetcode_furrycat
Условие задачи: https://yangx.top/leetcode_furrycat/28
И наконец, мы можем еще сократить время выполнения алгоритма, заранее посчитав префиксные и суффиксные суммы.
const prefixes = [...nums]
const suffixes = [...nums]
for (i = 1; i < nums.length; i++) {
const previousSum = prefixes[i - 1];
prefixes[i] += Math.max(0, previousSum);
}
for (i = nums.length - 2; i >= 0; i--) {
const previousSum = suffixes[i + 1];
suffixes[i] += Math.max(0, previousSum;
}
Теперь рассчитать
maxCenterSubArraySum
намного проще:
const maxCenterSubArraySum = prefixes[mid] + suffixes[mid+1]
Временная сложность: O(n)
Пространственная сложность: O(n)
#medium #arrays #divideandconquer #prefixsum
@leetcode_furrycat
Telegram
Leetcode Challenge
[Условие] Leetcode #53. Maximum Subarray
Ссылка на задачу на Leetcode
Получаем на вход массив целых чисел nums. Необходимо найти подмассив с самой большой суммой элементов. На выходе должна быть сумма элементов подмассива.
Подмассив - это непрерывная и…
Ссылка на задачу на Leetcode
Получаем на вход массив целых чисел nums. Необходимо найти подмассив с самой большой суммой элементов. На выходе должна быть сумма элементов подмассива.
Подмассив - это непрерывная и…
[Решение] Leetcode #53. Maximum Subarray
Условие задачи
Итого у нас получилось больше 5 способов решить одну и ту же задачку.
0 - Brute force
1 - Простая рекурсия
2 - Рекурсия с мемоизацией вычислений
3 - Табуляция, оптимизированная табуляция
4 - Алгоритм Кадане
5 - Разделяй и властвуй + оптимизация с предварительным расчетом
#medium #arrays #dp #divideandconquer #recursion #prefixsum
@leetcode_furrycat
Условие задачи
Итого у нас получилось больше 5 способов решить одну и ту же задачку.
0 - Brute force
1 - Простая рекурсия
2 - Рекурсия с мемоизацией вычислений
3 - Табуляция, оптимизированная табуляция
4 - Алгоритм Кадане
5 - Разделяй и властвуй + оптимизация с предварительным расчетом
#medium #arrays #dp #divideandconquer #recursion #prefixsum
@leetcode_furrycat
Telegram
Leetcode Challenge
[Условие] Leetcode #53. Maximum Subarray
Ссылка на задачу на Leetcode
Получаем на вход массив целых чисел nums. Необходимо найти подмассив с самой большой суммой элементов. На выходе должна быть сумма элементов подмассива.
Подмассив - это непрерывная и…
Ссылка на задачу на Leetcode
Получаем на вход массив целых чисел nums. Необходимо найти подмассив с самой большой суммой элементов. На выходе должна быть сумма элементов подмассива.
Подмассив - это непрерывная и…
[Условие] Leetcode #152. Maximum Product Subarray
Ссылка на задачу на Leetcode
Решение
Условие похоже на предыдущую задачу:
Получаем на вход массив целых чисел
#medium #arrays #dp #prefixsum
@leetcode_furrycat
Ссылка на задачу на Leetcode
Решение
Условие похоже на предыдущую задачу:
Получаем на вход массив целых чисел
nums
. Необходимо найти подмассив (непрерывный и непустой) с самым большим произведением элементов.
Кейс 1
nums = [2,3,-2,4]
Ответ: 6
Объяснение: [2,3]
Кейс 2
nums = [-2,0,-1]
Ответ: 0
Объяснение: 2 получиться не может, так как [-2,-1] это не подмассив, все остальные варианты дают 0 или отрицательное число
#medium #arrays #dp #prefixsum
@leetcode_furrycat
LeetCode
Maximum Product Subarray - LeetCode
Can you solve this real interview question? Maximum Product Subarray - Given an integer array nums, find a subarray that has the largest product, and return the product.
The test cases are generated so that the answer will fit in a 32-bit integer.
Example…
The test cases are generated so that the answer will fit in a 32-bit integer.
Example…
[Решение] Leetcode #152. Maximum Product Subarray
Условие задачи: https://yangx.top/leetcode_furrycat/39
Задачка с поиском подмассива с максимальным произведением похожа на задачу с поиском подмассива с максимальной суммой, поэтому и решать мы ее будем похожим образом: с использованием алгоритма Кадане.
Для задачи с наибольшей суммой его суть заключалась в том, что мы проходили по массиву слева направо и вычисляем наибольшую возможную сумму для ТЕКУЩЕГО элемента (от начала массива до текущего элемента). А затем просто брали максимальное из полученных значений.
Но с произведением все немного по-другому. Здесь у нас есть нули, которые любой подмассив сведут к нулю, а также отрицательные числа, которые по одиночке радикальном уменьшают общее произведение, но парами очень даже увеличивают. То есть здесь мы не можем сказать, что максимально возможное произведение для 2-го элемента - это именно то, что нам нужно, чтобы получить максимальное произведение для 3-го элемента.
Пример:
Очевидно, что этот алгоритм неправильный, и чтобы получить максимум для третьего элемента, нам следует взять -6 на предыдущем шаге.
В целом очевидно, что для массива состоящего только из положительных чисел максимальным подмассивом является сам этот массив (все элементы, умноженные друг на друга). Поэтому мы будем вычислять произведение непрерывно. То есть для каждого элемента мы найдем произведение ВСЕХ элементов до него, включая сам активный элемент.
Если в какой-то момент накапливаемое произведение стало равно 0, значит, нам попался элемент 0. В этом случае просто сбросим его до исходной единицы и продолжим считать уже после этого элемента.
А чтобы избежать разнообразных эксцессов с отрицательными числами, пройдем по массиву два раза - слева направо и справа налево:
1 - Если в массиве четное количество отрицательных чисел, то очевидно, что при обратном проходе ничего не изменится.
2 - Если же в массиве нечетное количество отрицательных чисел, то с помощью второго прохода мы сможем получить все комбинации подмассивов (слева и справа от отрицательного числа) и выбрать максимальную.
Временная сложность: O(N) - мы делаем два прохода по массиву, но коэффициент отбрасывается
#medium #arrays #dp #prefixsum
@leetcode_furrycat
Условие задачи: https://yangx.top/leetcode_furrycat/39
Задачка с поиском подмассива с максимальным произведением похожа на задачу с поиском подмассива с максимальной суммой, поэтому и решать мы ее будем похожим образом: с использованием алгоритма Кадане.
Для задачи с наибольшей суммой его суть заключалась в том, что мы проходили по массиву слева направо и вычисляем наибольшую возможную сумму для ТЕКУЩЕГО элемента (от начала массива до текущего элемента). А затем просто брали максимальное из полученных значений.
Но с произведением все немного по-другому. Здесь у нас есть нули, которые любой подмассив сведут к нулю, а также отрицательные числа, которые по одиночке радикальном уменьшают общее произведение, но парами очень даже увеличивают. То есть здесь мы не можем сказать, что максимально возможное произведение для 2-го элемента - это именно то, что нам нужно, чтобы получить максимальное произведение для 3-го элемента.
Пример:
const nums = [-2, 3, -4]
для n=1: maxTillNow = -2
для n=2: maxTillNow = Math.max(3, -6) = 3
для n=3: maxTillNow = Math.max(3, -12) = 3
Очевидно, что этот алгоритм неправильный, и чтобы получить максимум для третьего элемента, нам следует взять -6 на предыдущем шаге.
В целом очевидно, что для массива состоящего только из положительных чисел максимальным подмассивом является сам этот массив (все элементы, умноженные друг на друга). Поэтому мы будем вычислять произведение непрерывно. То есть для каждого элемента мы найдем произведение ВСЕХ элементов до него, включая сам активный элемент.
Если в какой-то момент накапливаемое произведение стало равно 0, значит, нам попался элемент 0. В этом случае просто сбросим его до исходной единицы и продолжим считать уже после этого элемента.
А чтобы избежать разнообразных эксцессов с отрицательными числами, пройдем по массиву два раза - слева направо и справа налево:
1 - Если в массиве четное количество отрицательных чисел, то очевидно, что при обратном проходе ничего не изменится.
2 - Если же в массиве нечетное количество отрицательных чисел, то с помощью второго прохода мы сможем получить все комбинации подмассивов (слева и справа от отрицательного числа) и выбрать максимальную.
function maxProduct(nums) {
let currentProduction = 1;
let maxTillNow = -Infinity;
for (let i = 0; i < nums.length; i++) {
const el = nums[i];
currentProduction *= el;
maxTillNow = Math.max(maxTillNow, currentProduction);
if (currentProduction === 0) {
currentProduction = 1;
}
}
currentProduction = 1;
for (let i = nums.length - 1; i >= 0; i--) {
const el = nums[i];
currentProduction *= el;
maxTillNow = Math.max(maxTillNow, currentProduction);
if (currentProduction === 0) {
currentProduction = 1;
}
}
return maxTillNow;
}
Временная сложность: O(N) - мы делаем два прохода по массиву, но коэффициент отбрасывается
#medium #arrays #dp #prefixsum
@leetcode_furrycat
Telegram
Leetcode Challenge
[Условие] Leetcode #152. Maximum Product Subarray
Ссылка на задачу на Leetcode
Условие похоже на предыдущую задачу:
Получаем на вход массив целых чисел nums. Необходимо найти подмассив (непрерывный и непустой) с самым большим произведением элементов.
…
Ссылка на задачу на Leetcode
Условие похоже на предыдущую задачу:
Получаем на вход массив целых чисел nums. Необходимо найти подмассив (непрерывный и непустой) с самым большим произведением элементов.
…
[Условие] Leetcode #153. Find Minimum in Rotated Sorted Array
Ссылка на задачу на Leetcode
Решение
На вход мы получаем отсортированный в порядке возрастания массив уникальных целых чисел -
Слишком просто, да?) Да, загвоздка в том, что массив у нас rotated ("прокручен" что ли) несколько раз.
Например, если у нас есть массив
Так вот наш массив прокручен от 1 до n раз. И мы должны найти в нем минимальный элемент. И сделать это нужно алгоритмом с временной сложностью не более, чем O(log n).
#medium #arrays #divideandconquer
@leetcode_furrycat
Ссылка на задачу на Leetcode
Решение
На вход мы получаем отсортированный в порядке возрастания массив уникальных целых чисел -
nums
и должны найти в нем минимальный элемент. Слишком просто, да?) Да, загвоздка в том, что массив у нас rotated ("прокручен" что ли) несколько раз.
Например, если у нас есть массив
[0,1,2,3,4]
и мы его один раз "прокрутим", получится [4,0,1,2,3]
. Если еще один раз прокрутим, будет [3,4,0,1,2]
. Так вот наш массив прокручен от 1 до n раз. И мы должны найти в нем минимальный элемент. И сделать это нужно алгоритмом с временной сложностью не более, чем O(log n).
Кейс 1
nums = [3,4,5,1,2]
ответ: 1
объяснение: оригинальный отсортированный массив [1,2,3,4,5] прокручен 3 раза
#medium #arrays #divideandconquer
@leetcode_furrycat
LeetCode
Find Minimum in Rotated Sorted Array - LeetCode
Can you solve this real interview question? Find Minimum in Rotated Sorted Array - Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example, the array nums = [0,1,2,4,5,6,7] might become:
* [4,5,6,7,0,1,2] if…
* [4,5,6,7,0,1,2] if…
[Решение] Leetcode #153. Find Minimum in Rotated Sorted Array
Условие задачи
Само условие (что сложность должна быть не более O(log n)) подсказывает нам, что следует использовать подход "разделяй и властвуй".
Берем исходный массив и находим его середину. Теперь нужно выяснить, в какой части массива (левой или правой) нужно продолжить поиск.
Тут может быть две ситуации:
- центральный элемент меньше первого элемента массива
например, [4,5,1,2,3] или [5,1,2,3,4]
тогда либо центральный элемент искомый, либо мы продолжаем поиск в левой части массива
- центральный элемент больше первого элемента массива
например, [1,2,3,4,5] или [3,4,5,1,2]
тогда либо первый элемент искомый, либо мы продолжаем поиск в правой части массива
Будем хранить промежуточный минимальный результат, а также индексы начала и конца того фрагмента массива, с которым мы сейчас работаем (чтобы не создавать новые массивы).
#medium #arrays #divideandconquer
@leetcode_furrycat
Условие задачи
Само условие (что сложность должна быть не более O(log n)) подсказывает нам, что следует использовать подход "разделяй и властвуй".
Берем исходный массив и находим его середину. Теперь нужно выяснить, в какой части массива (левой или правой) нужно продолжить поиск.
Тут может быть две ситуации:
- центральный элемент меньше первого элемента массива
например, [4,5,1,2,3] или [5,1,2,3,4]
тогда либо центральный элемент искомый, либо мы продолжаем поиск в левой части массива
- центральный элемент больше первого элемента массива
например, [1,2,3,4,5] или [3,4,5,1,2]
тогда либо первый элемент искомый, либо мы продолжаем поиск в правой части массива
Будем хранить промежуточный минимальный результат, а также индексы начала и конца того фрагмента массива, с которым мы сейчас работаем (чтобы не создавать новые массивы).
function findMin(nums: number[]): number {
let start = 0;
let end = nums.length - 1;
let min = Infinity;
while(start <= end) {
const mid = Math.floor((start + end) / 2);
if (nums[start] <= nums[mid]) {
min = Math.min(min, nums[start]);
start = mid + 1;
} else {
min = Math.min(min, nums[mid]);
end = mid - 1;
}
}
return min;
}
#medium #arrays #divideandconquer
@leetcode_furrycat
Telegram
Leetcode Challenge
[Условие] Leetcode #153. Find Minimum in Rotated Sorted Array
Ссылка на задачу на Leetcode
На вход мы получаем отсортированный в порядке возрастания массив уникальных целых чисел - nums и должны найти в нем минимальный элемент.
Слишком просто, да?) Да…
Ссылка на задачу на Leetcode
На вход мы получаем отсортированный в порядке возрастания массив уникальных целых чисел - nums и должны найти в нем минимальный элемент.
Слишком просто, да?) Да…
[Условие]. Leetcode #33. Search in Rotated Sorted Array
Ссылка на задачу на Leetcode
Решение
Тут мы снова имеем дело с rotated массивами (можно посмотреть в предыдущей задачке подробнее). На этот раз нам нужно искать конкретный элемент в таком "прокрученном" массиве. Нужно вернуть либо индекс искомого элемента, либо -1, если элемента в массиве нет.
Необходимо решить задачку за O(log n).
#medium #arrays #divideandconquer
@leetcode_furrycat
Ссылка на задачу на Leetcode
Решение
Тут мы снова имеем дело с rotated массивами (можно посмотреть в предыдущей задачке подробнее). На этот раз нам нужно искать конкретный элемент в таком "прокрученном" массиве. Нужно вернуть либо индекс искомого элемента, либо -1, если элемента в массиве нет.
Кейс 1
nums = [4,5,6,7,0,1,2], target = 0
ответ: 4
Кейс 2
nums = [4,5,6,7,0,1,2], target = 3
ответ: -1
Необходимо решить задачку за O(log n).
#medium #arrays #divideandconquer
@leetcode_furrycat
LeetCode
Search in Rotated Sorted Array - LeetCode
Can you solve this real interview question? Search in Rotated Sorted Array - There is an integer array nums sorted in ascending order (with distinct values).
Prior to being passed to your function, nums is possibly left rotated at an unknown index k (1 <=…
Prior to being passed to your function, nums is possibly left rotated at an unknown index k (1 <=…
[Решение] Leetcode #33. Search in Rotated Sorted Array
Условие задачи
Решение довольно простое. Как и в предыдущем примере мы берем массив, находим средний элемент и делим массив пополам. Проверив ряд простых условий, определяем, в какой половине продолжать поиск.
Основная сложность здесь - учесть все возможные ситуации.
#medium #arrays #divideandconquer
@leetcode_furrycat
Условие задачи
Решение довольно простое. Как и в предыдущем примере мы берем массив, находим средний элемент и делим массив пополам. Проверив ряд простых условий, определяем, в какой половине продолжать поиск.
Основная сложность здесь - учесть все возможные ситуации.
function search(nums: number[], target: number): number {
let start = 0
let end = nums.length - 1
while(start <= end) {
const mid = Math.floor((start + end) / 2)
if (nums[mid] === target) return mid
if (nums[start] <= nums[mid]) {
if (target >= nums[start] && target < nums[mid]) {
end = mid - 1
} else {
start = mid + 1
}
} else {
if (target > nums[mid] && target <= nums[end]) {
start = mid + 1
} else {
end = mid - 1
}
}
}
return -1
}
#medium #arrays #divideandconquer
@leetcode_furrycat
Telegram
Leetcode Challenge
[Условие]. Leetcode #33. Search in Rotated Sorted Array
Ссылка на задачу на Leetcode
Тут мы снова имеем дело с rotated массивами (можно посмотреть в предыдущей задачке подробнее). На этот раз нам нужно искать конкретный элемент в таком "прокрученном" массиве.…
Ссылка на задачу на Leetcode
Тут мы снова имеем дело с rotated массивами (можно посмотреть в предыдущей задачке подробнее). На этот раз нам нужно искать конкретный элемент в таком "прокрученном" массиве.…
[Условие]. Leetcode 15. 3Sum
Ссылка на задачу на Leetcode
Решение
На вход получаем массив целых чисел. Необходимо найти все тройки элементов, сумма которых равна 0. Разумеется, в тройках должны быть только уникальные элементы. Порядок не важен.
#medium #arrays #twopointers
@leetcode_furrycat
Ссылка на задачу на Leetcode
Решение
На вход получаем массив целых чисел. Необходимо найти все тройки элементов, сумма которых равна 0. Разумеется, в тройках должны быть только уникальные элементы. Порядок не важен.
Кейс 1
nums = [-1,0,1,2,-1,4]
ответ: [ [-1, -1, 2], [-1, 0, 1] ]
Кейс 2
nums = [0,1,1]
ответ: []
Кейс 3
nums = [0,0,0]
ответ: [[0,0,0]]
#medium #arrays #twopointers
@leetcode_furrycat
LeetCode
3Sum - LeetCode
Can you solve this real interview question? 3Sum - Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.
Notice that the solution set must not contain…
Notice that the solution set must not contain…
[Решение] Leetcode #15. 3Sum
Условие задачи
Сортируем массив и запускаем итерацию по его элементам.
Если текущий элемент больше 0, дальше проверять не имеет смысла, так как дальше идут только положительные числа, которые не могут в сумме дать 0.
Для текущего элемента начинаем искать два дополнительных - ищем их в оставшейся (справа) части массива. Для этого запускаем ее перебор с двух сторон. Если сумма трех элементов равна 0, добавляем их в результат.
#medium #arrays #twopointers
@leetcode_furrycat
Условие задачи
Сортируем массив и запускаем итерацию по его элементам.
Если текущий элемент больше 0, дальше проверять не имеет смысла, так как дальше идут только положительные числа, которые не могут в сумме дать 0.
Для текущего элемента начинаем искать два дополнительных - ищем их в оставшейся (справа) части массива. Для этого запускаем ее перебор с двух сторон. Если сумма трех элементов равна 0, добавляем их в результат.
function threeSum(nums: number[]): number[][] {
if (nums.length < 3) return [];
nums.sort((a, b) => a - b);
if (nums[0] > 0) return [];
const triplets = [];
for (let i = 0; i < nums.length; i++) {
if (nums[i] > 0) break;
if (nums[i] === nums[i - 1]) continue;
let j = i + 1;
let k = nums.length - 1;
while(j < k) {
const sum = nums[i] + nums[j] + nums[k];
if (sum === 0) {
triplets.push([nums[i], nums[j], nums[k]]);
j++;
k--;
} else if (sum < 0) {
j++;
} else {
k--;
}
}
}
return triplets;
}
#medium #arrays #twopointers
@leetcode_furrycat
Telegram
Leetcode Challenge
[Условие]. Leetcode 15. 3Sum
Ссылка на задачу на Leetcode
На вход получаем массив целых чисел. Необходимо найти все тройки элементов, сумма которых равна 0. Разумеется, в тройках должны быть только уникальные элементы. Порядок не важен.
Кейс 1
nums =…
Ссылка на задачу на Leetcode
На вход получаем массив целых чисел. Необходимо найти все тройки элементов, сумма которых равна 0. Разумеется, в тройках должны быть только уникальные элементы. Порядок не важен.
Кейс 1
nums =…
[Условие]. Leetcode 11. Container With Most Water
Ссылка на задачу на Leetcode
Решение
У нас есть несколько вертикальных линий, расположенных последовательно через равное расстояние. На вход получаем массив, в котором содержатся их высоты.
Задача - найти максимальную площадь прямоугольника, сторонами которого являются две из этих линий.
#medium #arrays #twopointers
@leetcode_furrycat
Ссылка на задачу на Leetcode
Решение
У нас есть несколько вертикальных линий, расположенных последовательно через равное расстояние. На вход получаем массив, в котором содержатся их высоты.
Задача - найти максимальную площадь прямоугольника, сторонами которого являются две из этих линий.
Кейс 1
height = [1,8,6,2,5,4,8,3,7] (на картинке)
Ответ: 49 (между линиями с высотой 8 и 7)
#medium #arrays #twopointers
@leetcode_furrycat
[Решение]. Leetcode 11. Container With Most Water
Условие задачи
Чтобы найти решение, нужно перебрать все возможные комбинации линий. Для этого воспользуемся методом двух указателей, пойдем с начала и конца массива и будем вычислять текущую площадь, постепенно смещаясь к центру. Из всех полученных результатов отберем максимальный.
#medium #arrays #twopointers
@leetcode_furrycat
Условие задачи
Чтобы найти решение, нужно перебрать все возможные комбинации линий. Для этого воспользуемся методом двух указателей, пойдем с начала и конца массива и будем вычислять текущую площадь, постепенно смещаясь к центру. Из всех полученных результатов отберем максимальный.
function getVolume(height: number[], left: number, right: number): number {
const h1 = height[left]
const h2 = height[right]
return Math.min(h1, h2) * (right - left)
}
function maxArea(height: number[]): number {
let left = 0
let right = height.length - 1
let max = 0
while(left < right) {
max = Math.max(max, getVolume(height, left, right))
if (height[left] < height[right]) {
left++
} else {
right--
}
}
return max
}
#medium #arrays #twopointers
@leetcode_furrycat
Telegram
Leetcode Challenge
[Условие]. Leetcode 11. Container With Most Water
Ссылка на задачу на Leetcode
У нас есть несколько вертикальных линий, расположенных последовательно через равное расстояние. На вход получаем массив, в котором содержатся их высоты.
Задача - найти максимальную…
Ссылка на задачу на Leetcode
У нас есть несколько вертикальных линий, расположенных последовательно через равное расстояние. На вход получаем массив, в котором содержатся их высоты.
Задача - найти максимальную…