diff --git "a/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/283. Move Zeroes.md" "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/283. Move Zeroes.md" new file mode 100644 index 0000000..ea21050 --- /dev/null +++ "b/\347\253\266\346\212\200\343\203\227\343\203\255\345\260\261\346\264\273\351\203\250PR\347\224\250/283. Move Zeroes.md" @@ -0,0 +1,57 @@ +近くで似た問題を解いていたため、かなり早く解けた。 +## Two-pointersによる解法 ★ +--- +### 1回目 (2m36s) +時間計算量: O(N) +空間計算量: O(1) + +```python +class Solution: + def moveZeroes(self, nums: List[int]) -> None: + """ + Do not return anything, modify nums in-place instead. + """ + left = 0 + + for right in range(len(nums)): + if nums[right] != 0: + nums[left], nums[right] = nums[right], nums[left] + left += 1 +``` + + +left, right -> left_most_zero, iに変更 + +### 2回目 +```python +class Solution: + def moveZeroes(self, nums: List[int]) -> None: + """ + Do not return anything, modify nums in-place instead. + """ + left_most_zero = 0 + + for i in range(len(nums)): + if nums[i] != 0: + nums[left_most_zero], nums[i] = nums[i], nums[left_most_zero] + left_most_zero += 1 +``` + +## 0以外を左端に詰めていく解法 +```python +class Solution: + def moveZeroes(self, nums: List[int]) -> None: + """ + Do not return anything, modify nums in-place instead. + """ + zero_index = 0 + + for i in range(len(nums)): + if nums[i] == 0: + continue + nums[zero_index] = nums[i] + zero_index += 1 + + for i in range(zero_index, len(nums)): + nums[i] = 0 +```