算法——Move Zeros实现及优化

第一个版本:新建一个数组,用新建的数组放置数组中的非零元素。

时间复杂度:O(n)  空间复杂度:O(n)

void moreZeroes(vector<int>& nums)
{
    vector<int> nonZeroesElements;
    for(int i=0;i<nums.size();i++)
    {
        if(nums[i]!=0)
            nonZeroesElements.push_back(nums[i]);  //尾部插入数字:vector.push_back(a)
    }
  for(int i=0;i<nonZeroesElements.size();i++)
        nums[i]=nonZeroesElements[i];
   for(int i=nonZeroesElements.size();i<nums.size();i++)
        nums[i]=0;
}

第二个版本优化了空间复杂度。

时间复杂度:O(n)  空间复杂度:O(1)

//第二个版本
void moreZeroes(vector<int>& nums)
{
    int k=0;    //nums中非零元素为[0...k)
    
    //遍历到第i个元素后,保证[0...i]中的所有非0元素
    //都按照顺序排在[0...k)中
    for(int i=0;i<nums.size();i++)
    {
        if(nums[i]!=0)
            nums[k++]=nums[i];
    }
    //剩余的位置赋值为0
    for(int i=k;i<nums.size();i++)
            nums[i]=0;
}

第三个版本简化了代码

//第三个版本
void moreZeroes(vector<int>& nums)
{
    int k=0;    //nums中非零元素为[0...k)
    
    //遍历到第i个元素后,保证[0...i]中的所有非0元素
    //都按照顺序排在[0...k)中
    for(int i=0;i<nums.size();i++)
    {
        if(nums[i]!=0)
            swap(nums[k++],nums[i]);  //两个数字交换位置
    }
}
原文地址:https://www.cnblogs.com/aishanyishi/p/9491487.html