一.原题如下
二.解题思路
- 使用快慢指针,快慢指针相对而行(即同一个方向出发)
- 先将非0的元素,移动到数组前面,即保持了非0元素的相对顺序
- 那么慢指针代表的就是非0元素的个数,慢指针经过的元素,都是非0元素
- 然后剩下的元素,即都为0,再重复赋值为0即可
三.复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)
四.完整题解
具体步骤请查看每个关键步骤的代码注释
class Solution {
public void moveZeroes(int[] nums) {
// 定义快慢指针
int slow = 0, fast = 0;
// 定义边界,快指针不能超过数组长度
while (fast < nums.length) {
// 如果快指针对应的值不等于0,则对应值赋值给慢指针,慢指针向前一步
if (nums[fast] != 0) {
nums[slow] = nums[fast];
slow++;
}
// 快指针每次都走一步
fast++;
}
// 将非0的值移动到数组前面之后,剩下的值即都是0值
for (int i = slow; i < nums.length; i++) {
nums[i] = 0;
}
}
}