1.LeetCode算法习题讲解--双指针--移动零

一.题目

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

二.题目分析

给定一个数组,在原数组上进行修改,数组左侧为非0,右侧为0

  1. 约束 1 :非 0 元素原有先后相对顺序不能改变
  2. 约束 2原地修改数组,不能新开数组复制数据(空间复杂度尽量\(O(1)\));

三.讲解算法原理

定义两个指针 cur 和 dest,cur用来遍历数组,dest指向0与非0的边界线

只要 nums[cur] 不是 0,就把这个元素归入左侧合法区间:

  1. dest 先往右挪一位(开辟出新的存放位置);
  2. nums[cur] 赋值到 nums[dest]; 遍历结束后,[0, dest] 全是按原顺序保留的非 0 数,dest+1 到数组末尾全部填 0。

当cur指向非0元素,dest++ 然后与 cur所指向的位置进行互换

过程:

示例:nums = [0,1,0,3,12]dest=-1,cur=0

  1. cur=0nums[0]=0:直接跳过,不处理
  2. cur=1nums[1]=1≠0 dest +=1 → dest=0 nums[0] = 1 此时有效区间:[0,0],内容[1]
  3. cur=2nums[2]=0:跳过
  4. cur=3nums[3]=3≠0 dest +=1 → dest=1 nums[1] = 3 有效区间:[0,1],内容[1,3]
  5. cur=4nums[4]=12≠0 dest +=1 → dest=2 nums[2] = 12 有效区间:[0,2],内容[1,3,12]

一轮遍历完毕,dest=2; 对下标 3、4 全部赋值 0,最终数组:[1,3,12,0,0]

四.编写代码

相关推荐
不正经学生31 分钟前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥3 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲3 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
圣保罗的大教堂4 小时前
leetcode 1406. 石子游戏 III 困难
leetcode
晊晌_h4 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦5 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考5 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客6 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
丰锋ff7 小时前
面试问题合集
面试·职场和发展
颜挺锐7 小时前
如何轻松通过性能测试之第四篇:性能测试项目怎么交付?一文讲透九步实施流程(附面试话术 + 实战清单)
面试·职场和发展