【LeetCode原地复写零】:双指针+逆向填充,O(n)时间O(1)空间最优解!

【LeetCode原地复写零】:双指针+逆向填充,O(n)时间O(1)空间最优解!
在这里插入图片描述
🎁个人主页:User_芊芊君子
🎉欢迎大家点赞👍评论📝收藏⭐文章
🔍系列专栏:Java.数据结构
在这里插入图片描述


在这里插入图片描述

【前言】

本文聚焦 LeetCode“原地复写零”经典题目,核心需求是在固定长度数组中复写每个 0并右移其余元素,且需满足原地修改、不使用额外数组空间的约束。正向遍历易导致后续元素被覆盖,为此本文详解双指针+逆向填充的优雅解法,高效破解这一核心难点。

文章目录:

一、复写零

在这里插入图片描述

二、思路分析

复写零这道题是让在原数组修改,如果从前向后遍历,后面的元素会被覆盖,所以我们要找到被复写的最后一个元素,然后从后往前复写。运用双指针+逆向填充

1.找到复写的最后一个数

定义两个指针:cur遍历原数组,pre模拟复写后的数组指针;cur==0时,pre向后移动两位,cur!=0时,pre向后移动两位(因为要复写0);当pre>=n-1时,停止遍历,这时,cur指的就是要复写的最后一个元素
在这里插入图片描述

边界情况:如下面这种情况,pre == n时,说明要复写的最后一个元素是0,这里单独处理

将数组最后一位改为0,也就是n==0;cur向前移动一位,pre向前移动两位;
在这里插入图片描述

2.开始从后往前复写

从cur向前遍历,cur != 0时,就让arr[pre] == arr[cur];
cur == 0时,就让pre和pre-1位置的数都改为0,然后继续向前复写。

在这里插入图片描述

三、代码展示

classSolution{publicvoidduplicateZeros(int[] arr){int cur =0, pre =-1, n = arr.length;//1.找到要复写的最后一个元素while(cur < n){if(arr[cur]==0){ pre +=2;}else{ pre++;}if(pre >= n-1){break;} cur++;}//处理边界情况if(pre == n){ arr[n-1]=0; cur--; pre -=2;}//开始从后向前复写while(cur >=0){if(arr[cur]!=0){ arr[pre--]= arr[cur--];}else{ arr[pre--]=0; arr[pre--]=0; cur--;}}}}

四、时间和空间复杂度分析

  • 时间复杂度O(n):只需要遍历数组两次,第一次定位边界,第二次逆向填充;
  • 空间复杂度O(1):使用的原数组,没有额外空间

五、总结

本解法通过双指针先定位复写边界,再逆向填充数组,既避免了正向遍历的元素覆盖问题,又实现了 O(n) 线性时间复杂度与 O(1) 常数空间复杂度的最优表现。其中“先确定边界、再逆向操作”的思路,是解决数组原地修改类问题的关键技巧,具有较强的通用性与实用性。
在这里插入图片描述

Read more

LeetCode——二分(初阶)

LeetCode——二分(初阶)

文章目录 * 简要介绍 * 相关例题 * 二分查找 * 题目描述 * 题目分析 * 实现思路 * 实现代码 * 在排序数组中查找元素的第一个和最后一个位置 * 题目描述 * 题目分析 * 实现思路 * 实现代码 * 小技巧 * 搜索插入位置 * 题目描述 * 题目分析 * 实现思路 * 实现代码 * 代码一 * 代码二 * [x 的平方根 ](https://leetcode.cn/problems/sqrtx/) * 题目描述 * 题目分析 * 实现思路 * 实现代码 * 代码一 * 代码二 简要介绍 二分算法是我们写算法题目中比较常见的一种优化算法,这个算法很好地体现了分治的思想,我们的二分算法不管是在算法题目中屡见不鲜,在实际工程当中也是十分热门的一个算法,比如我们的数

By Ne0inhk
❿⁄₁₄ ⟦ OSCP ⬖ 研记 ⟧ 密码攻击实践 ➱ 传递Net-NTLMv2哈希

❿⁄₁₄ ⟦ OSCP ⬖ 研记 ⟧ 密码攻击实践 ➱ 传递Net-NTLMv2哈希

郑重声明:本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。 🔋 点赞 | 能量注入 ❤️ 关注 | 信号锁定 🔔 收藏 | 数据归档 ⭐️ 评论 | 保持连接💬 🌌 立即前往 👉晖度丨安全视界🚀 ▶ 信息收集  ▶ 漏洞检测 ▶ 初始立足点  ▶ 权限提升 ▶ 横向移动 ➢ 密码攻击 ➢ 传递Net-NTLMv2哈希🔥🔥🔥 ▶ 报告/分析 ▶ 教训/修复 目录 1.密码破解 1.1 破解Windows哈希实践 1.1.4 传递Net-NTLMv2哈希概述 1.1.4.1 攻击背景 1.1.4.2 攻击流程 1.1.

By Ne0inhk
算法闯关日记 Episode :解锁链表新副本——破解「相交」迷局与「回文」谜题

算法闯关日记 Episode :解锁链表新副本——破解「相交」迷局与「回文」谜题

🔥@晨非辰Tong: 个人主页 👀专栏:《C语言》、《数据结构与算法入门指南》 💪学习阶段:C语言、数据结构与算法初学者 ⏳“人理解迭代,神理解递归。” 文章目录 * 引言 * 一、相交链表 * 1.1 思路解答 + 作图演示 * 1.2 验证算法 * 二、链表的回文结构 * 2.1 思路解答 + 作图演示 * 2.2 验证算法 * 总结 引言 在算法学习中,链表因其灵活的结构成为高频考点。本期将攻克两大经典问题:「相交链表」 与「链表的回文结构」。跟随本篇题解,逐步拆解问题,提升链表类问题的实战能力 一、相交链表 题目链接:160.相交链表-力扣(LeetCode) * 题目描述: 给你两个单链表的头节点 headA

By Ne0inhk
【数据结构与算法】解锁顺序表潜能:一站式实现高效通讯录系统

【数据结构与算法】解锁顺序表潜能:一站式实现高效通讯录系统

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人等方向学习者 ❄️个人专栏:《C语言》《【初阶】数据结构与算法》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、通讯录框架Test.c * 二、通讯录 * 2.1 Contacts.h * 2.2 Contacts.c * 三、底层逻辑 * 3.1 SeqList.h * 3.2 SeqList.c * 四、基于顺序表的通讯录实现效果 * 4.1 添加 * 4.2 删除 * 4.3 修改 * 4.4

By Ne0inhk