题目

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

1
2
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

1. 必须在原数组上操作,不能拷贝额外的数组。
2. 尽量减少操作次数。

思路1

采用双循环,当遇到零元素时,与后面序列中第一个非零元素交换。

时间复杂度: $O(n!)$

结果:
执行用时 : 16 ms
内存消耗 :37.4 MB

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public void moveZeroes(int[] nums) {
int len = nums.length;
for(int i=0;i<len-1;i++){
if(nums[i]==0){
int j =i+1;
while(j<len&&nums[j]==0){
j++;
}
if(j==len) break;
nums[i]=nums[j];
nums[j]=0;
}
}
}
}

思路2

评论中高赞方法是采用双指针的方式。

先将非零元素按照顺序紧密移动到前面,再按照零元素数量对数组后面元素补零。

代码2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public void moveZeroes(int[] nums) {
int i = 0;
int len = nums.length;
for(int j=0; j<len; j++){
if(nums[j]!=0){
nums[i]=nums[j];
i++;
}
}
for(; i<len; i++){
nums[i] = 0;
}
}
}

结果
执行用时 : 1 ms
内存消耗 :39.3 MB

题目链接