问题描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
进阶:你能尽量减少完成的操作次数吗?
两次遍历
第一次遍历把所有的非零都依次写到数组前面。
第二次遍历把后面的 0 补回去。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
n = len(nums)
j = 0
for i in range(n):
if nums[i] != 0:
nums[j] = nums[i]
j += 1
for i in range(j, n):
nums[i]=0
算法复杂度:
O
(
N
)
O(N)
O(N)
空间复杂度:
O
(
N
)
O(N)
O(N)
双指针
第一种解法是利用了最后的数字全是为0的特点,是比较 tricky 的做法。
更加通用的算法思想是 双指针。第一个指针表示左侧指针,第二个指针表示右侧指针,当右侧不是零的时候,跟左侧互换。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
n = len(nums)
left = right = 0
while right < n:
if nums[right] != 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right += 1
算法复杂度:
O
(
N
)
O(N)
O(N)
空间复杂度:
O
(
N
)
O(N)
O(N)
参考文献:
[1] 力扣官方题解