解法一:双重循环 ( 最笨的,时间O(N2),空间O(N) )
public void moveZeroes(int[] nums) {
int len = nums.length;
for (int i = 0; i < len; i++) {
if (nums[i] == 0) {
for (int j = i + 1; j < len; j++) {
if (nums[j] != 0) {
nums[i] = nums[j];
nums[j] = 0;
break;
}
}
}
}
}
解法二:遍历保存非0元素 ( 空间换时间,时间O(N),空间O(N) )
public void moveZeroes1(int[] nums) {
int[] temp = new int[nums.length];
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
temp[count++] = nums[i];
}
}
for (int i = 0; i < nums.length; i++) {
if (i < count) {
nums[i] = temp[i];
} else {
nums[i] = 0;
}
}
}
解法三:一次遍历( 时间O(N),空间O(1) )
public void moveZeroes2(int[] nums) {
//只遍历一次
int index = 0;
for(int i=0;i<nums.length;i++){
if(nums[i] != 0){
nums[index++] = nums[i];
}
}
//上面的for循环已经将所有的非0元素移动到数组的左边了
//下面的for循环从index开始,将元素全部赋值为0
for(int i=index;i<nums.length;i++){
nums[i] = 0;
}