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

30-дневный вызов летекодирования: перемещать нули

Четвертая задача 30-дневного вызова лецкодирования. Теги с Python, LeetCode, кодированием, алгоритмами.

Решение:

Когда я прочитал проблему впервые, это пришло к моему мнению прямого решения, которое я хочу пройти через массив всякий раз, когда я столкнулся с нулем, я просто удаляю его, и когда я закончу, добавляю их снова.

Но процедура удаления в списке в Python будет стоить На) и мы сделаем это внутри цикла, которая проходит через нашу Nums Массив, так что полностью мы доберемся до O (n 2 ) для всей процедуры.

zeros = 0
for i in range(len(nums)): # O(n)
  del nums[i] # O(n)
  zeroes += 1

Тогда я думал, что хорошо, как насчет использования Python count () Функция, чтобы подсчитать 0 и использовать другой массив, чтобы содержать все мои нерешительные элементы в нем. Затем добавьте количества Zeroes 0 до конца нового массива и позже при переопределении наших Nums Массив по этому новым значениям массива, потому что он не требует ничего не возвращения.

Если вы думаете, что немного, вы можете увидеть, что этот подход будет работать лучше, чем выше, так как он возьмет только На) , но мы использовали дополнительное пространство, которое является На) Когда мы скопировали все на новый определенный массив. Вы можете увидеть полный код для этого moveszeroes_2 () Отказ

Тогда я думал, что нет, я хочу время O (n) с пространством O (1. ) Можем ли мы сделать это! Да, конечно, мы можем, как, используя два указателя, медленный назовут это last_non_zero. Это будет держать мое последнее ненулевое число, а быстрый указатель назовет это i И это будет держать мой текущий элемент в Nums множество.

То, что мы будем делать, просто перейдем по массиву всякий раз, когда мы столкнулись с нулевым числом, будет перемещать его в место, где last_non_zero Указатель расположен, а затем увеличивайте этот указатель на 1, и когда мы закончим, сделайте другой петлю, начиная с откуда last_non_zero до конца массива и просто продолжать добавлять нули.

  • Пример:

nums = [ 0,1,0,3,12]

  1. Начнем с last_non_zero , i
  2. Проверить это Nums [I] нет, нет ( nums [i] [0] )
  3. увеличить I ++ и проверьте еще раз, да Nums [1] Как это 1 Так что переместите его на nums [last_non_zero] [I] а затем увеличить last_non_zero ++ Теперь наш массив выглядит так nums = [1,1,0,3,12]

  4. продолжай повторять эту процедуру до конца нашего массива будет выглядеть так nums = [1,3,12,3,12] и last_non_zero Отказ

  5. Теперь мы начинаем с last_non_zero до конца и просто добавить 0. Как мы идем, так что наш окончательный результат будет nums = [ 1,3,12,0,0]

  • Псевдокод:
1. define `last_non_zero = 0`, `n = len(nums)`
2. loop from i = 0 to n:
3.    if nums[i] != 0:
4.      nums[i] = nums[last_non_zero]
5.      last_non_zero += 1
6. loop from j = last_non_zero to n:
7.    nums[j] = 0
  • Сложность:

  • Сложность времени прямо вперед На)

  • Космическая сложность Мы не использовали дополнительное пространство, так что это O (1)

Решение: moveszeroes ()

Существует оптимальное решение для этой проблемы, пытаясь найти его:).

Оригинал: “https://dev.to/luffy_14/30-day-leetcoding-challenge-move-zeroes-234b”