题目:
Given an array nums
, write a function to move all 0
's
to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12]
, after calling your function, nums
should
be [1, 3, 12, 0, 0]
.
Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations.
我的思路:
直观的思路就是通过循环,但是这样的时间复杂度为O(n2),代码如下:
public class Solution {
public void moveZeroes(int[] nums) {
int i = 0;
int j = 0;
for(i = 0; i < nums.length; i++){
if(nums[i] == 0){
for(j = i; j < nums.length; j++){
if(nums[j] != 0){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
break;
}
}
}
}
}
}
思路为:
先记下0的个数,将非0的数字向前挪,最后再将0补在最后。具体来说,在记下0的个数的同时挪动数字。
例如[1,2,0,3,0,0,4]
当index到3时,0的个数为1,则3挪到其前一个位置上,数组变成{1,2,3,3,0,0,4}
当index到4时,0的个数为3,则4需要向前挪3位,数组变成{1,2,3,4,0,0,4}
最后将最后3位的值设为0。
代码如下:
public class Solution {
public void moveZeroes(int[] nums) {
//处理空数组的情况
int length = nums.length;
if(length == 0){return;}
int i;
int count = 0;
for(i = 0; i < length; i++){
if(nums[i] == 0){
//记录0的个数
count++;
}else{
//0有几个就将该值向前挪几个位置
nums[i-count] = nums[i];
}
}
//设置末尾的0
for(i = length - count; i < length; i++){
nums[i] = 0;
}
}
}