Рубрики
Без рубрики

IETCODE объяснил: июль Задача 2021, неделя 4 – разбиение массива в непересекающиеся комплекты (средние)

описание проблемы В июле LetCoding Challenge 2021, неделя 4, мы поручены с … Tagged с алгоритмами, компьютерами, программированием, Python.

описание проблемы

В июле Letcoding Challenge 2021, неделя 4, мы поручены следующим образом ( Оригинальная проблема здесь ):

Учитывая массив Nums , разделить его на два (смежных) подвеска левый и правильно так что:

  • каждый элемент в левый меньше или равно каждому элементу в правильно .
  • левый и правильно не пустые.
  • левый имеет самый маленький возможный размер.

Мы должны вернуть длину левый После такого разделения и проблема имеет следующие примечания:

  • 2 длиной
  • 0 [я] ^ 6
  • Он гарантирован, что необходимо, по меньшей мере, один из способов разделения, как описано.

Пример 1:

  • nums = [5,0,3,8,6]
  • Выход: 3.
  • Объяснение: слева = [5, 0, 3]/вправо = [8, 6]

Пример 2:

  • nums = [1,1,1,0,6,12]
  • Выход: 4.
  • Объяснение: слева = [1,1,1,0]/вправо = [6,12]

Найти решение

Как нас находятся находятся на нахождении подшипников, которые являются смежный , только естественно искать индекс в массиве, чтобы сделать «вырезать» – то есть индекс после какого массива левый заканчивается.

Мы будем использовать максимальные значения в подчинении массива для разработки решения.

Это требование, чтобы каждый элемент левый должен быть меньше или равен каждому элементу правильно и левый должен быть как можно меньше. Давайте подумаем об этом немного.

Для первого требования было бы достаточно просто найти максимум во всем массиве и сделать «вырезать» за ним. То есть, если максимум был на индексе Я (Предположим, мы начнем с 0), то левый будет содержать индексы от 0 через I-1 чисел, а также правильно будет содержать индексы из Я через N-1. , Если n Размер массива числа . Это, однако, сделает осталось как можно больше , не так маленький, насколько это возможно, как это требуется.

Чтобы сохранить размер левый Как можно меньше, мы можем думать о сценарии, где есть индекс Я , что не обязательно максимум массива, но максимум NUMS [0 .. I] И нет другого номера в Nums [i + 1 .. n] Это больше, чем что осталось от индекса i .

Второй пример, предоставленный автором, представляет эту вещь: хотя 6 не является максимальным значением в массиве в целом, это максимум префикса от 0 через его индекс (который здесь здесь), и не имеет номера меньше, чем Максимум размещения [0..3] справа.

Затем проблема возобновляет на поиск такого числа. Мы можем сделать это в O (N) сложности времени и O (1) пространственную сложность.

Мы пересекаем на массив и сохраняем две переменные, пусть они будут называться left_max , который представляет максимальное значение, которое будет помещено в левый Массив и last_max , который представляет последние максимальные значения, которые мы столкнулись до этой точки.

Изначально мы установим оба этих значения первым элементе массива. Мы также будем держать переменную под названием вырезать Представляя индекс после распределения массива в левый и правильно . Итак, массив будет вырезан после первого элемента.

В то время как зацикливаться через массив, есть два типа номеров, которые мы можем найти в одном индексе Я :

  • номер меньше, чем left_max : В таком случае нам нужно переместить разреза, потому что иначе мы не получим необходимые массивы; Мы должны иметь в виду, что перед тем, как сделать вырезание, число [I] должно быть помещено в массив правильно ; Итак, если бы мы не вырезали, мы не будем уважать требования проблемы.
  • число больше или равно left_max : В этом случае нам нужно обновить значение last_max При необходимости, так что когда мы вырезаем, мы узнаем максимум в левый массив в O (1) время.

Давайте посмотрим короткое решение Python, используя этот подход:

Это было бы все для этого решения. Я вернусь с другими решениями лецкода для моего нового Леткод объяснил ряд. Тем временем не стесняйтесь комментировать свои решения на других языках программирования здесь. Или, если вы не чувствуете, что вы можете прочитать через мою другую серию – Магия вычислений Обсуждая другие алгоритмические темы!

Оригинал: “https://dev.to/kruzzy/leetcode-explained-july-challenge-2021-week-4-partition-array-into-disjoint-sets-medium-54ic”