Нам дан массив положительных целых чисел, называемый nums, и положительное целое число, называемое target. Нам нужно найти наименьшую длину подмассива в пределах «nums», сумма которого больше чем или равно «target». Если нет подмассива, соответствующего требованиям, мы возвращаем 0.
Что такое подмассив?
Массив, являющийся частью другого массива, элементы которого соседствуют друг с другом.
Пример:
мойМассив: [1, 3, 5, 8, 2, 4]
мойПодмассив: [3, 5, 8]
Итак, для этой задачи давайте сформируем входной массив с именем «nums» и целевое число с именем «target». Затем мы решаем выходные данные, находя наименьшую длину подмассива из массива «nums», сумма которого больше или равна «цели».
Пример:
цель: 4
числа: [2, 4, 4]
Вывод: наименьшая длина будет равна 1.
Обратите внимание, что выходным значением является 1, поскольку после просеивания элементов мы видим, что подмассив [4] длиной 1 представляет собой наименьшую длину, сумма которой больше или равна целевому числу 4. Следовательно, 1 будет наименьшая длина подмассива.
Описание проблемы
Далее давайте перечислим несколько шагов, которые нам понадобятся для решения этой проблемы:
Шаг 1) определение размера массива
Шаг 2) выяснить, как перемещаться по массиву, метод двух указателей с циклами
Шаг 3) выясните, как отслеживать сумму чисел, чтобы найти минимальную длину подмассива и минимальную длину каждого подмассива.
Шаг 4) обратите внимание на все ограничения.
Шаг 5) нарисуйте концепцию
Затем , соберите все это вместе на языке программирования!
Описание проблемы
Шаг 1)Чтобы найти размер массива, мы можем использовать атрибут длины класса Array:
nums.length
Шаг 2)Чтобы выяснить, как пройти по каждому числу в массиве, мы можем использовать различные методы. Для решения этой задачи мы воспользуемся методом двух указателей.
Шаг 3)Поскольку мы используем метод двух указателей, мы можем отслеживать сумму чисел и минимальную длину подмассива в циклах while, обновляя переменные во время итерации по массиву.
Шаг 4)Некоторыми ограничениями, которые следует учитывать, являются подмассивы, которые не найдены с целевым числом, поэтому мы можем установить переменную и сказать:
if (min_length == Integer.MAXVALUE) return 0;
Шаг 5)Что касается кодирования, мы хотим устранить ограничение пустого массива и любых переменных и циклов, которые нам понадобятся. Кроме того, в цикле нам нужно переместить указатель и обновить переменные, чтобы найти целевую сумму и минимальную длину подмассива в соответствии с этой суммой. Наконец, мы возвращаем минимальную длину подмассива.
Объяснение кода
Заголовок метода:
class Solution { public int minSubArrayLen(int target, int[] nums) {
Ограничение пустого массива:
if (nums.length == 0) return 0;
Объявите два указателя, переменную суммы и переменную минимальной длины.
int i = 0; int j = 0; int sum = 0; int min_length = Integer.MAX_VALUE;
Сначала заголовок цикла while с указателем j:
while (j < nums.length){
Обновить переменную суммы для элемента с индексом j, указатель j перемещается на один индекс вверх:
sum = sum + nums[j++];
Если обнаружено, что сумма больше или равна целевой, введите еще один цикл while и найдите минимальное значение между min_length и двумя указателями. Затем снова обновите сумму и переместите указатель i на один индекс вверх в массиве:
while (sum >= target){ min_length = Math.min(min_length, j - i); sum = sum - nums[i++]; } }
Проверьте, изменилась ли переменная min_length, верните 0, если изменений нет, верните переменную минимальной длины, если она изменилась:
if (min_length == Integer.MAX_VALUE) return 0; else return min_length; } }
Полный код:
class Solution { public int minSubArrayLen(int target, int[] nums) { if (nums.length == 0) return 0; int i = 0; int j = 0; int sum = 0; int min_length = Integer.MAX_VALUE; while (j < nums.length){ sum = sum + nums[j++]; while (sum >= target){ min_length = Math.min(min_length, j - i); sum = sum - nums[i++]; } } if (min_length == Integer.MAX_VALUE) return 0; else return min_length; } }
Благодарность принадлежит специалисту по решению проблем jeantimex на LeetCode и их решению. В этой ветке обсуждения есть больше ответов с хорошими объяснениями этой проблемы.
Спасибо за прочтение!