283. 移动零
type
status
date
slug
summary
tags
category
difficulty
icon
password
283. 移动零
提示
给定一个数组
nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
示例 2:
提示:
1 <= nums.length <= 104
231 <= nums[i] <= 231 - 1
解题思路
这道题目要求将数组中的所有0移动到末尾,同时保持非零元素的相对顺序不变。解题思路如下:
双指针法
使用两个指针 i 和 j:
- 指针 i 用于遍历整个数组
- 指针 j 指向当前应该存放非零元素的位置
具体步骤:
- 初始化两个指针 i 和 j,都指向数组开头
- 遍历数组,当遇到非零元素时:
- 将当前元素(nums[i])与 j 指向的位置进行交换
- j 指针向后移动一位
- 继续遍历直到数组结束
这样操作后:
- 所有非零元素都会按照原有顺序移动到数组前面
- 所有零元素自动被交换到了数组后面
时间复杂度分析
- 时间复杂度:O(n),其中 n 是数组的长度,只需要遍历一次数组
- 空间复杂度:O(1),只使用了常数级别的额外空间
代码解释
代码中的关键部分解释:
- 当 nums[i] 不为0时,将其与 nums[j] 交换,并将 j 向后移动一位
- 如果 nums[i] 为0,i 继续向后移动,j 保持不变
- 这样可以保证 j 之前的所有元素都是非零的,且保持了原有顺序
- 作者:Episkey
- 链接:https://episkey.top/article/move-zeroes
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。