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=0,nums[0]=0:直接跳过,不处理
  2. cur=1,nums[1]=1≠0 dest +=1 → dest=0 nums[0] = 1 此时有效区间:[0,0],内容[1]
  3. cur=2,nums[2]=0:跳过
  4. cur=3,nums[3]=3≠0 dest +=1 → dest=1 nums[1] = 3 有效区间:[0,1],内容[1,3]
  5. cur=4,nums[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]。

四.编写代码

相关推荐
Yuzhiyuxia18 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
UIU11418 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场19 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi19 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David20 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院20 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng21 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~1 天前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py1 天前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing1 天前
LeetCode100 42.接雨水
java·算法·leetcode