283. 移动零 Easy
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
解题思路
输入:一个数组 nums
输出:将 0 移动到数组的末尾,同时保持相对顺序
本题属于 快慢指针 问题。
我们可以用一个慢指针指向第一个数,不论是否是 0
再用一个快指针从头遍历数组,当快指针为非0的数时(包含快慢指针为同一个数),交换快慢指针的值,交换后移动慢指针
由于快指针遇到 0 会跳过,所以一定会出现快指针走在慢指针的前面,慢指针就停在了 0 上,此时交换数字就是将 0 移动到快指针的位置
代码实现
python
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
left = 0 # 慢指针,指向下一个应该放非零元素的位置
# right 为快指针,从头到尾遍历数组
for right in range(len(nums)):
# 只有当当前元素不为 0 时才处理
if nums[right] != 0:
# 交换当前位置 right 和 left 的元素
# 这样非零元素被放到 left 位置,原来 left 位置的 0 被移到 right
nums[left], nums[right] = nums[right], nums[left]
# 移动慢指针,准备放下一个非零元素
left += 1
javascript
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var moveZeroes = function(nums) {
let left = 0;
for (let right in nums) {
if (nums[right] !== 0) {
[nums[left], nums[right]] = [nums[right], nums[left]]
left ++;
}
}
};
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)