283. 移动零
1. 题目简介
难度:简单,原题链接:283. 移动零。
给定一个数组
nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
2. 问题分析
先把非零元素按原顺序写到数组前面,再把剩余位置补成 0,就能完成原地修改。这里用两个下标分工:right 扫描每个元素,left 指向下一个非零元素应该写入的位置。
- 遇到 0 时,只让
right前进。 - 遇到非零元素时,把
nums[right]赋给nums[left],再让left前进;right继续扫描。
left 始终不超过 right,因此写入不会覆盖尚未读取的元素。非零元素又是按从左到右的顺序写入的,所以它们的相对顺序保持不变。
扫描结束后,left 等于非零元素的个数,指向第一个需要补零的位置。例如 [0, 1, 0, 3] 会先变成 [1, 3, 0, 3],此时 left = 2;把下标 2 到末尾补成 0,才得到最终的 [1, 3, 0, 0]。
3. 代码实现
class Solution {
public void moveZeroes(int[] nums) {
int left = 0;
int right = 0;
while (right < nums.length) {
if (nums[right] != 0) {
nums[left++] = nums[right];
}
right++;
}
while (left < nums.length) {
nums[left++] = 0;
}
}
}
4. 复杂度分析
- 时间复杂度:O(n),需要遍历数组。
- 空间复杂度:O(1),原地修改,仅申请了常量的空间。
来源:Coding 101 原文 · 免费阅读,引用请保留出处。内容使用说明