移动零

Posted by zhouqian on Monday, June 13, 2022

力扣 283. 移动零

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。


方案一:通过过滤器将所有非零元素顺序前置。

func moveZeroes(nums []int)  {
    // 定义一个指针指向 nums 开头
    n := 0
    // 遍历所有元素
    for i := 0; i < len(nums); i++ {
        // filter 过滤非零元素
        if nums[i] != 0 {
            // 将非零元素的值赋值给指针 n,并将其往后移动一位
            nums[n] = nums[i]
            n++
        }
    }
    // 将剩余元素置零
    // n 前进的过程中已经将所有非零元素都记录下来
    for ; n < len(nums); n++ {
        nums[n] = 0
    }
}
  • 时间复杂度:O(n),因为需要遍历所有数组元素,所以时间复杂度为 O(n)。
  • 空间复杂度:O(1),因为没有借助额外的辅助空间,只是在原数组的基础上进行遍历移动,所以空间复杂度为 O(1)。