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]。

四.编写代码

相关推荐
信奥卷王9 小时前
[GESP202609 六级] 分树规划
算法
夏幻灵9 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
徐小黑ACG11 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
Navigator_Z11 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
北极有牛12 小时前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记12 小时前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练
浮链序12 小时前
怎么证明"你这个模型是偷我的"——把蒸馏变成取证工具
算法·安全·llm
小O的算法实验室12 小时前
IEEE TMC,面向异构物联网的多目标量子行为拓扑优化算法
算法
圣保罗的大教堂13 小时前
leetcode 301. 删除无效的括号 困难
leetcode