LeetCode例题讲解:移动044

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

首先想到的应该是当两个连续的数,前面为零,后面不为零时,则两者互换位置

objectivec 复制代码
void moveZeroes(int* nums, int numsSize) {
    for(int i = 0;i+1 < numsSize ;i++)
    {
        if(nums[i] == 0 && nums[i+1] != 0)
        {
            int r    = nums[i+1];
            nums[i+1] = 0;
            nums[i]   = r;
        }

    }
    
}

但会遇到一个问题,如果循环一次,当两个零连续时,则无法继续,默认为成功

因此需要不断必须循环判断,当全部成立时方可停止循环判断。

objectivec 复制代码
void moveZeroes(int* nums, int numsSize) {
    while(true)
    {
    int count =0;
        for(int i = 0;i+1 < numsSize ;i++)
        {
            if(nums[i] == 0 && nums[i+1] != 0)
            {
                int r    = nums[i+1];
                nums[i+1] = 0;
                nums[i]   = r;
                count++;
                break;
            }

        }
        if(count == 0)
        {
            break;
        }
    }
    
}

但该循环时间复杂度过大,需加以改进

若去除for中的break,则可以一个循环找出多个错误,加快一些时间

objectivec 复制代码
void moveZeroes(int* nums, int numsSize) {
    while(true)
    {
    int count =0;
        bool isOK = true;
        for(int i = 0;i+1 < numsSize ;i++)
        {
            if(nums[i] == 0 && nums[i+1] != 0)
            {
                nums[i]   = nums[i+1];
                nums[i+1] = 0;
                isOK = false;
                count++;
            }

        }
        if(isOK)
        {
            break;
        }
    }
    
}
objectivec 复制代码
void moveZeroes(int* nums, int numsSize) {
    int j = 0;
    for(int i = 0;i < numsSize ; i++)
    {
        if(nums[i] != 0)
        {
            nums[j] = nums[i];
            j++;
        }
    }
        while(j < numsSize)
        {
            nums[j] = 0;
            j++;

        }

    
}
相关推荐
xing.yu.CTF1 小时前
Alice与Bob-素数分解密码学
算法·密码学
瓦力的狗腿子1 小时前
Starlink卫星动力学系统仿真建模第十讲-基于SMC和四元数的卫星姿态控制示例及Python实现
开发语言·python·算法
闻缺陷则喜何志丹2 小时前
【二分查找】P11201 [JOIG 2024] たくさんの数字 / Many Digits|普及
c++·算法·二分查找·洛谷·字符·数字·需要
shinelord明2 小时前
【再谈设计模式】访问者模式~操作对象结构的新视角
开发语言·数据结构·算法·设计模式·软件工程
y.Ghost2 小时前
数据结构与算法:均值滤波
c语言·图像处理·人工智能·算法·计算机视觉·均值算法·均值滤波
程序员南飞2 小时前
算法-数据结构-图-邻接表构建
java·数据结构·算法·职场和发展
yngsqq2 小时前
推导二维平面上点绕原点旋转的公式
数学·算法·机器学习·平面
Moring.3 小时前
贪心算法
算法·贪心算法
xiaohiiii3 小时前
2022年上半年软件设计师下午题题目详解与知识点解析(附真题及答案)
java·数据库·职场和发展·uml
Ritsu栗子3 小时前
代码随想录算法训练day63---图论系列7《prim算法&kruskal算法》
c++·算法·图论