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

        }

    
}
相关推荐
Oneshot11 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
文丑颜不良啊11 小时前
LeetCode2541~2560题目解析
java·leetcode
青少儿编程课堂12 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
kongdong12 小时前
Hikyuu | RSI均值回归交易策略实现
算法·均值算法·回归·量化交易·交易策略·hikyuu
小王C语言12 小时前
优选算法:分治-归并排序
算法
小南家的青蛙13 小时前
微服务体系下DevOps运维岗位面试方案设计
运维·面试·职场和发展·devops
非优秀程序员1 天前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
文丑颜不良啊1 天前
LeetCode2481~2500题目解析
java·leetcode
武子康1 天前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习