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

        }

    
}
相关推荐
森焱森1 分钟前
60 美元玩转 Li-Fi —— 开源 OpenVLC 平台入门(附 BeagleBone Black 驱动简单解析)
c语言·单片机·算法·架构·开源
课堂剪切板1 小时前
ch07 题解
算法·深度优先
June bug1 小时前
【Python基础】变量、运算与内存管理全解析
开发语言·python·职场和发展·测试
科大饭桶2 小时前
数据结构自学Day5--链表知识总结
数据结构·算法·leetcode·链表·c
我爱C编程4 小时前
基于Qlearning强化学习的1DoF机械臂运动控制系统matlab仿真
算法
chao_7894 小时前
CSS表达式——下篇【selenium】
css·python·selenium·算法
chao_7895 小时前
Selenium 自动化实战技巧【selenium】
自动化测试·selenium·算法·自动化
YuTaoShao5 小时前
【LeetCode 热题 100】24. 两两交换链表中的节点——(解法一)迭代+哨兵
java·算法·leetcode·链表
怀旧,5 小时前
【数据结构】8. 二叉树
c语言·数据结构·算法
泛舟起晶浪5 小时前
相对成功与相对失败--dp
算法·动态规划·图论