一、题目要求
二、解体思路
1.双指针法
思路:左指针代表0元素的起始位置,右指针代表数组的遍历位置;
在没有遇到0之前,左指针和右指针的位置是相同的,此时什么都不需要做;
在遇到0之后,左指针和右指针的位置不在相同,此时需要调换位置,即把右指针的值赋值给左指针,右指针改为0,同时左指针左移一位
代码如下:
public static void moveZeroes(int[] nums) {
int left = 0;
for (int right = 0;right<nums.length;right++) {
if(nums[right]!=0){
if(left!=right){
nums[left] =nums[right];
nums[right]=0;
}
left++;
}
}
}
时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。
空间复杂度:O(1)。只需要常数的空间存放若干变量
2.移除法
思路:第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j];
非0元素统计完了,剩下的都是0了,所以第二次遍历把末尾的元素都赋为0即可
代码:
public static void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
//第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
int j = 0;
for(int i=0;i<nums.length;++i) {
if(nums[i]!=0) {
nums[j++] = nums[i];
}
}
//非0元素统计完了,剩下的都是0了
//所以第二次遍历把末尾的元素都赋为0即可
for(int i=j;i<nums.length;++i) {
nums[i] = 0;
}
}
复杂度分析
时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。
空间复杂度:O(1),只需要常数的空间存放若干变量。