leetcode 283. 移动零(详解)双指针c++

news/2025/2/26 14:33:33

题目链接:283. 移动零 - 力扣(LeetCode)

算法原理

解法一:辅助数组

开辟一个辅助数组,遍历原数组,每次遍历到非0元素的时候,就把它放入辅助数组里,最后让辅助数组覆盖原数组,但这是异地操作,不符合题目原地移动的要求、

                                    

解法二:利用双指针(注意是使用变量充当指针,不是真的第一个指针出来,i = 0,相当于有一个指针指向0下标)

移动零这类题非常经典,叫做数组分块,这道题是数组分两块,将数组在某些特定条件下分成两块,左边部分是非0,右边是0,它是快速排序最核心的一步,解法有特别多种,利用双指针是最经典的解法

定义两个指针:

  • cur:标记非0元素的最后一个位置(上图右边)
  • i:扫描数组

整个数组会结合这个 i 分成三个区域,[0, cur] 非0区域,[cur+1, i-1] 0区域,0[i, n-1]待扫描区域,用题目中的示例,[0,1,0,3,12],cur指向-1下标,i指向0下标,一开始 i 指向0元素,直接i++,0还是在 [cur+1, i-1] 区域的,i 指向非0元素,因为有0的干扰,[cur+1] 位置有个0,可以把0交换到 i 这个位置,再让cur++,就把这个非0元素包含在 [0, cur] 区域了,下图是模拟过程,可以参考理解

分类讨论:

  1. 遇到 0:直接 i++
  2. 遇到 1:swap(cur + 1,i),cur++,i++

 

代码: 

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        for(int i = 0, cur = -1; i < nums.size(); ++i)
        {
            if (nums[i]) //非0元素
                //交换完cur+1后cur还要向后走,直接先自增
                swap(nums[++cur], nums[i]);
        }
    }
};


http://www.niftyadmin.cn/n/5868826.html

相关文章

电商API接口设计:商品、订单与支付模块的微服务拆分实践

在电商系统中&#xff0c;将商品、订单与支付模块进行微服务拆分是一种常见且有效的架构设计策略&#xff0c;它可以提高系统的可维护性、可扩展性和灵活性。以下是关于这三个模块微服务拆分的详细实践&#xff1a; 1. 微服务拆分的原因 高内聚低耦合&#xff1a;每个模块专注于…

交叉编译curl(OpenSSL)移植ARM详细步骤

运行配置脚本 使用 Configure 脚本配置 OpenSSL&#xff0c;指定目标平台和安装路径&#xff1a; curl downloads 各个版本 Old 1.1.1 Releases | OpenSSL Library 各个版本 从 OpenSSL 官网下载源码包 tar -xzf openssl-1.1.1b.tar.gz cd openssl-1.1.1b/运行配置脚本 使…

pnpm的基本用法

以下是 pnpm 的核心命令和使用指南&#xff0c;涵盖从安装依赖到项目管理的常见操作&#xff1a; 1. 基础命令 (1) 安装依赖 pnpm install # 安装 package.json 中的所有依赖 pnpm install <包名> # 安装指定包&#xff08;自动添加到 dependencies&#xf…

跟着AI学vue第九章

第九章&#xff1a;Vue 生态与跨端开发 1. 深入探索 Vue 生态工具 Vue 生态就像是一个热闹的“软件小镇”&#xff0c;里面有各种各样的工具和资源&#xff0c;能帮助你把 Vue 项目打造得更好。 Vue CLI 高级用法 Vue CLI 就像是小镇里的“建筑规划师”&#xff0c;一开始它…

DeepSeek 提示词:基础结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【设计原则】开闭原则

开闭原则&#xff08;OCP&#xff09;在C#中的实践&#xff1a;如何设计可扩展的代码 一、什么是开闭原则&#xff1f;二、未遵循开闭原则的案例三、用开闭原则重构代码四、进一步优化&#xff1a;动态加载操作五、开闭原则的优势六、适用场景七、总结 一、什么是开闭原则&…

【GO】学习笔记

目录 学习链接 开发环境 开发工具 GVM - GO多版本部署 GOPATH 与 go.mod go常用命令 环境初始化 编译与运行 GDB -- GNU 调试器 基本语法与字符类型 关键字与标识符 格式化占位符 基本语法 初始值&零值&默认值 变量声明与赋值 _ 下划线的用法 字…

halcon三维点云数据处理(二十七)remove_bin_for_3d_object_localization

目录 一、remove_bin_for_3d_object_localization代码第一部分二、remove_bin_for_3d_object_localization代码第二部分三、效果图一、remove_bin_for_3d_object_localization代码第一部分 1、读图构建3D模型。 2、一次二值化选取区域。 3、一次和背景差值选取区域。 4、在二维…