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++;

        }

    
}
相关推荐
你撅嘴真丑3 小时前
第九章-数字三角形
算法
uesowys3 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder3 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮3 小时前
AI 视觉连载1:像素
算法
智驱力人工智能4 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥5 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风5 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風5 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT065 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠6 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法