跳到主要内容

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 原文 · 免费阅读,引用请保留出处。内容使用说明