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++;
        }
    }
};
相关推荐
涛涛北京2 分钟前
【强化学习实验】- 策略梯度算法
人工智能·算法
栀秋66617 分钟前
深入浅出链表操作:从Dummy节点到快慢指针的实战精要
前端·javascript·算法
serendipity_hky19 分钟前
【go语言 | 第2篇】Go变量声明 + 常用数据类型的使用
开发语言·后端·golang
Pyeako30 分钟前
机器学习之KNN算法
人工智能·算法·机器学习
xhxxx36 分钟前
从被追问到被点赞:我靠“哨兵+快慢指针”展示了面试官真正想看的代码思维
javascript·算法·面试
报错小能手38 分钟前
STL_unordered_map
开发语言·c++·哈希算法
可信计算38 分钟前
【算法随想】一种基于“视觉表征图”拓扑变化的NLP序列预测新范式
人工智能·笔记·python·算法·自然语言处理
月明长歌1 小时前
【码道初阶】【LeetCode 110】平衡二叉树:如何用一个“Magic Number”将复杂度从O(N²)降为 O(N)?
linux·算法·leetcode
yaoh.wang1 小时前
力扣(LeetCode) 14: 最长公共前缀 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
CreasyChan1 小时前
C#特性(Attributes)详解
开发语言·c#