思路:双指针(快慢指针)
初始状态:i (fast)指向当前遍历的元素 ; j (slow)表示下一个非0元素存放的位置
-
时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。
-
空间复杂度:O(1)。只需要常数的空间存放若干变量。
public void moveZeroes(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] != 0) {
if (slow != fast) { // 减少赋值的次数
nums[slow] = nums[fast];
}
slow++;
}
}
for (; slow < nums.length; slow++) {
nums[slow] = 0;
}
}