Решение:
Когда я прочитал проблему впервые, это пришло к моему мнению прямого решения, которое я хочу пройти через массив всякий раз, когда я столкнулся с нулем, я просто удаляю его, и когда я закончу, добавляю их снова.
Но процедура удаления в списке в 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]
- Начнем с
last_non_zero
,i
- Проверить это
Nums [I]
нет, нет (nums [i] [0]
) увеличить
I ++
и проверьте еще раз, даNums [1]
Как это1
Так что переместите его наnums [last_non_zero] [I]
а затем увеличитьlast_non_zero ++
Теперь наш массив выглядит такnums = [1,1,0,3,12]
продолжай повторять эту процедуру до конца нашего массива будет выглядеть так
nums = [1,3,12,3,12]
иlast_non_zero
ОтказТеперь мы начинаем с
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”