当前位置: 首页 > news >正文

双指针算法_移动零

移动零

文章目录

  • 移动零
    • 题目链接:[移动零](https://leetcode.cn/problems/move-zeroes/)
    • 题目解析:
    • 讲解算法原理
      • 双指针算法的介绍:
      • (对于本题)双指针算法的效果:
      • 解题分析:
    • 解题代码:

题目链接:移动零

题目解析:

在这里插入图片描述
例如:[0,1,0,3,12],在不复制数组的情况下,对它进行操作,结果如下:
[1,3,12,0,0],可以看到,满足了题目的两个要求:

  1. 0 都在数组的末尾
  2. 非零元素的相对顺序,是有序的,由小到大

讲解算法原理

类似于这种对数组内容进行操作的题目,可以理解为 数组划分 或 数组分块 问题。

数组划分问题的特点:
给定一个数组,根据某种规则,将数组的内容,划分为若干个区间

例如这道 移动零 的题目:
给定一个数组:[0,1,0,3,12]
规则:非零元素移动到数组的左边0 移动到数组的右边(末尾),同时非零元素的相对顺序得保持。
在这里插入图片描述

解决这类题目,有一个很经典的算法:双指针算法

双指针算法的介绍:

这里的指针,不是 C语言 当中的指针

这里的指针,指的是 数组下标 来作为指针。因为数组里面,有个很好的特性,我们可以通过数组的下标,来索引(寻找)到数组的元素。

(对于本题)双指针算法的效果:

首先,先定义两个 int 类型的整数,作为指针

变量名是自定义的,这里使用 dest 和 cur 。
dest => destination 终点,目的地
cur => current 最近的
在这里插入图片描述

两个指针的作用:
cur:从左往右扫描数组,遍历数组
dest:已处理的区间内,非零元素的最后一个位置(作为一个分割线)

画一个图来展示这两个指针的作用:
在这里插入图片描述

利用这两个变量,将这个数组的内容划分为三个区间
第一个:[ 0,dest ] ,已经处理过的区间,里面全都是 非零元素
第二个:[ dest+1,cur-1 ] ,已经处理过的区间,里面全都是 0
第三个:[ cur,n-1 ] ,cur当前所指向的元素,是没有被处理过的元素,n-1 是因为数组的下标是从 0下标 开始的,下标的最大值为 数组元素个数(n)-1 ,这个区间表示的是待处理的元素

当 dest 和 cur 从左向右走的过程中,三个一直保持这样的性质的话,当 cur 这个指针 等于 n 时,也就是把整个数组扫描过一遍之后(cur == n),待处理的区间的没有了。
在这里插入图片描述

解题分析:

对这两个指针进行初始化:
cur:初始化为 0,因为它是要从左到右遍历整一个数组的。
dest:由于刚开始进行数组扫描的时候,是没有 非零元素 的,所以,初始化为 -1
在这里插入图片描述

算法演示:
在这里插入图片描述

解题代码:

//这是力扣提交的代码部分
class Solution {public void moveZeroes(int[] nums) {
//        刚开始时没有非零元素的,dest初始化为 -1int dest = -1;for(int cur = 0;cur < nums.length;cur++) {
//            由于遇到 0 ,不做处理,仅 cur++
//            而for循环结束的最后,就会进行 cur++
//            所以,仅需要处理遇到 非零元素 的情况if(nums[cur] != 0) {dest++;int tmp = nums[cur];nums[cur] = nums[dest];nums[dest] = tmp;}}}
}

文章转载自:

http://FDN2z9v6.wmnpm.cn
http://QAfFc4Cz.wmnpm.cn
http://vRGc8kzs.wmnpm.cn
http://E1Su6NWK.wmnpm.cn
http://AGFoV3zq.wmnpm.cn
http://ir8aPxHh.wmnpm.cn
http://0AgXrARK.wmnpm.cn
http://CvE7tPMN.wmnpm.cn
http://sBEb876i.wmnpm.cn
http://M5hZIG7l.wmnpm.cn
http://GkbeWRhF.wmnpm.cn
http://fRNhrG0m.wmnpm.cn
http://GmgnehF4.wmnpm.cn
http://UWo9nKE9.wmnpm.cn
http://N6yOCUh8.wmnpm.cn
http://sYUMHT66.wmnpm.cn
http://5iYnNfL9.wmnpm.cn
http://wYLQiU34.wmnpm.cn
http://DnU70ZyM.wmnpm.cn
http://CZ3sA97l.wmnpm.cn
http://yyRXegoW.wmnpm.cn
http://65dB8J8D.wmnpm.cn
http://vZnqUiQf.wmnpm.cn
http://DOZ4Li9p.wmnpm.cn
http://lgchztEX.wmnpm.cn
http://EFTiDcVM.wmnpm.cn
http://6BbZRGXT.wmnpm.cn
http://GvqI7BDJ.wmnpm.cn
http://qxf9dro8.wmnpm.cn
http://T49FyIf5.wmnpm.cn
http://www.dtcms.com/a/378673.html

相关文章:

  • 数据结构之复杂度
  • 几种常用锁
  • android13修改WiFi扫描二维码识别识别成功率不高的问题
  • params和body传参讲解
  • 单片机学习笔记
  • 图卷积神经网络(GCN)学习笔记
  • MySQL执行过程中如何选择最佳的执行路径
  • 牛客周赛 Round 108(思维、位运算、DP、SOSDP)
  • 插槽 el-input 数据双向 绑定失效 响应式更新失败
  • 代码随想录算法训练营第58天 | 拓扑排序精讲、dijkstra(朴素版)精讲
  • 揭秘KafkaStreams 线程缓存:NamedCache深度解析
  • 中标麒麟7.4部署gitlab-runner
  • Shopify指纹手机矩阵:无限扩店,横扫FB/GG广告封号风险
  • react context如何使用
  • npm是什么?优缺点又是什么?
  • ubuntu24.04+5070ti训练yolo模型(2)
  • [SQL]查询SSMS当前连接数据库列表
  • 乾博绝缘监测仪为水泥厂安全生产护航
  • JVM(jdk1.8) 实战
  • 设计模式(C++)详解—工厂方法模式(2)
  • 自动化运维实践:SaaS系统Nginx配置文件自动化运维脚本详解
  • 3D模型快速混沌加密matlab完整代码
  • 敏捷实践指南(中文版):章节梳理/主要知识体系和知识点
  • 第一章 ELK Stack基础概念与架构
  • GraphQL RPC 与通用索引器公测介绍:为 Sui 带来更强大的数据层
  • ShardingSphere 分库分表技术实现与实战案例
  • Docker 部署 MongoDB:单节点与副本集的最佳实践
  • OCR 识别表现好坏离不开什么?
  • 阿里云ACA认证[特殊字符]阿里云ACP认证
  • 计算机网络实验00---环境准备