LeetCode 283. 移动零

目录

原题

移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾 ,同时保持非零元素的相对顺序 。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1 :

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

输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]

输出: [0]

题目解析

题目中给了我们一个数组 nums,要求我们将 nums 中的 0 都移动至数组的尾部 并且非 0 元素的相对位置要不变,比如示例 1,移动前, 1 在 3 之前,3 在 12 之前,将 0 移动到数组尾部后,1 仍然要在 3 之前,3 仍然要在 12 之前

算法原理

本题属于将数组分块的问题,我们要做的就是最终将数组分为两块,一块全是非 0 元素,一块全是 0 元素

为了达到这样的效果,我们可以定义两个指针(这里的指针是下标 ,并非真正意义上的指针),先用这两个指针将数组划分为三个部分第一个部分已经处理好的元素第二个部分待处理的 0第三个部分待处理的非 0 元素 ,然后将待处理的 0 和待处理的 非 0 元素交换即可

设置两个指针 src 和 dest,src 指向被处理过的最后一个元素dest 指向 0 元素,刚开始 src 为 -1,因为数组还未被处理过,dest 为 0,然后 dest 开始寻找非 0 元素,当 dest 找到非 0 元素时,src 指向的下一个就是 0 元素,将这两个交换,不断重复过程直到 dest 遍历完整个数组

代码实现

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int src = 0;
        int dest = -1;

        while (src < nums.size())
        {
            if (nums[src] != 0)
            {
                swap(nums[src], nums[++dest]);
            }
            src++;
        }
    }
};
相关推荐
漫随流水23 分钟前
leetcode算法(111.二叉树的最小深度)
数据结构·算法·leetcode·二叉树
fpcc25 分钟前
跟我学C++中级篇——Linux中文件和链接及重定向
linux·c++
Fcy6481 小时前
C++ set&&map的模拟实现
开发语言·c++·stl
你怎么知道我是队长8 小时前
C语言---枚举变量
c语言·开发语言
李慕婉学姐8 小时前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫8 小时前
quecpython中&的具体含义和使用场景
开发语言·python
じ☆冷颜〃8 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
云栖梦泽8 小时前
易语言中小微企业Windows桌面端IoT监控与控制
开发语言
数据大魔方8 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
POLITE38 小时前
Leetcode 23. 合并 K 个升序链表 (Day 12)
算法·leetcode·链表