LeetCode283 移动0

LeetCode283 移动0

在这篇博客中,我们将探讨如何通过不复制数组的情况下,在原地对数组进行操作,将所有零移动到数组的末尾。这个问题的描述如下:

问题描述: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

解决方案

算法思路

我们可以使用双指针技巧来解决这个问题。具体来说,我们可以使用快速排序的思想,将数组中的非零元素按顺序移到数组的前面,而零元素会留在后面。

我们定义两个指针:一个指针 forst 用于指向已处理的非零元素的末尾位置,另一个指针 back 用于遍历数组。

代码实现

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int forst = -1; // 指向已处理的非零元素的末尾位置
        int back = 0;   // 遍历数组的指针

        while (back < nums.size()) {
            if (nums[back] != 0) {
                swap(nums[back], nums[++forst]); // 将非零元素移到数组的前面
            }
            back++;
        }
    }
};

时间复杂度分析

该算法只对数组进行了一次线性遍历,因此时间复杂度为 O(n),其中 n 是数组的长度。

结论

通过使用双指针技巧,我们成功设计了一个时间复杂度为 O(n) 的算法,将给定数组中的所有零元素移动到数组的末尾,同时保持非零元素的相对顺序。这种解决方案在不复制数组的情况下原地对数组进行操作,具有较好的性能。

相关推荐
2601_967979121 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔1 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
通信小呆呆2 小时前
电子战干扰技术:从“蛮力压制”到“精准欺骗”,再到“认知博弈”
算法·通信·isac
老师我太想进步了20262 小时前
【数据结构-6】算法美学之单链表(1)
数据结构·算法
希望我万事顺遂3 小时前
力扣hot100-滑动窗口最大值
数据结构·算法·leetcode
꧁细听勿语情꧂3 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
是main不是漫4 小时前
【双指针|LeetCode1089 复写零】巧用逆向思路,破解原地覆盖陷阱
数据结构·算法·leetcode
专注仿真13 小时前
知识问答模型用到的算法集详解及代码实例
python·算法·代码·大模型训练·控制算法
罗西的思考14 小时前
【轻量化复刻大模型 / KIMI K3】AttnRes 模块交互式演示
人工智能·算法·机器学习
好悬给我拽开线18 小时前
ZILOT 论文解析
算法