LeetCode-283-移动0

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution(object):
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: None Do not return anything, modify nums in-place instead.
"""
# 0的个数
size = len(nums)
index = 0

for num in nums:
if num is not 0:
nums[index] = num
index+=1

for i in range(size-index):
nums[index] = 0
index+=1

空间最优,操作局部优化(双指针)

这种方法与上面的工作方式相同,即先满足一个需求,然后满足另一个需求。它以一种巧妙的方式做到了这一点。上述问题也可以用另一种方式描述,“将所有非 0 元素置于数组前面,保持它们的相对顺序相同”。
这是双指针的方法。由变量 “cur” 表示的快速指针负责处理新元素。如果新找到的元素不是 0,我们就在最后找到的非 0 元素之后记录它。最后找到的非 0 元素的位置由慢指针 “lastnonzerofoundat” 变量表示。当我们不断发现新的非 0 元素时,我们只是在 “lastnonzerofoundat+1” 第个索引处覆盖它们。此覆盖不会导致任何数据丢失,因为我们已经处理了其中的内容(如果它是非 0 的,则它现在已经写入了相应的索引,或者如果它是 0,则稍后将进行处理)。
在 “cur” 索引到达数组的末尾之后,我们现在知道所有非 0 元素都已按原始顺序移动到数组的开头。现在是时候满足其他要求了,“将所有 0 移动到末尾”。我们现在只需要在 “lastnonzerofoundat” 索引之后用 0 填充所有索引。

复杂度分析

时间复杂度:O(n)O(n)。但是,操作仍然是局部优化的。代码执行的总操作(数组写入)为 nn(元素总数)。
空间复杂度:O(1)O(1),只使用常量空间。

----\(˙<>˙)/----赞赏一下吧~