给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
我的解法:定义双指针i和j,首先让i从左到右查找数组nums中第一个值为0的下标,然后使j=i+1,让j从i+1开始查找数组nums中值不为0的下标,最后交换nums[i]和nums[j]。若i和j都在有效范围,则重复执行上述过程。
时间复杂度:O(n),空间复杂度:O(1)
class Solution {
public void moveZeroes(int[] nums) {
if (nums.length == 0) return;
int i = 0, j = 0;
while (true) {
/*找到值为0的最小下标位置i*/
while (nums[i] != 0) {
/*数组中不存在0*/
if (++i == nums.length) {
return;
}
}
/*i已经到达数组末尾*/
if (i + 1 == nums.length) {
return;
}
/*从i+1开始存照值为非0的最小下标位置j*/
j = i + 1;
while (nums[j] == 0) {
/*越界, 说明[i, nums.length)全为0*/
if (++j == nums.length) {
return;
}
}
/*交换i所指的0和j所指的非0*/
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i += 1;
}
}
}
更优解法:
public static void moveZeroes(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[j++] = nums[i];
}
}
while (j < nums.length) {
nums[j++] = 0;
}
}
}