Leetcode Hot 100 Problems —— 移动零
移动零
问题描述:
给一个数组,将所有0移动到数组末尾,保持其余元素位置不变。
空间复杂度只能为O(n)即不能使用辅助数组。
解法:
使用异步双指针,前指针指向前序全非零的最后一个元素的后一位,后指针指向前指针后第一个非零元。
每次将将后指针的值覆盖到前指针当前位置,前指针后移一位,后指针移动到下一个非零元。
当后指针越界后,前指针从当前位置移动到数组末尾,沿途所有位置补零。
代码描述如下:
#include <iostream>
using namespace std;
void movezero(int nums[],int numsSize){
if(nums == NULL || numsSize == 0)
return;
int j=0;
for(int i=0;i<numsSize;i++){
if(nums[i]!=0)
nums[j++] = nums[i];
}
for(int i=j;i<numsSize;i++)
nums[i] = 0;
}
改进的解法
void movezero_1(int nums[], int numsSize){
if(nums == NULL || numsSize == 0)
return;
int j=0;
for(int i=0;i<numsSize;i++){
if(nums[i] != 0){
if(i != j){
nums[j] = nums[i];
nums[i] = 0;
}
j++;
}
}
}