【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

【探寻C++之旅】第十五章:哈希表

【探寻C++之旅】第十五章:哈希表

请君浏览 * 前言 * 1. 哈希表的概念 * 1.1 哈希函数(Hash Function):哈希表的 “地址映射引擎” * 1.2 哈希冲突(Hash Collision):哈希函数的 “必然产物” * 1.3 负载因子(Load Factor):衡量 “数据拥挤程度” 的核心指标 * 2. 哈希函数 * 2.1 直接定址法(Direct Addressing) * 2.2 除留余数法(Division Method) * 2.3 其他方法 * 3. 哈希冲突 * 3.1 开放寻址法(Open Addressing) * 简单的代码实现: * 3.

By Ne0inhk
哈希表的介绍和使用

哈希表的介绍和使用

今天,我们来介绍的是哈希表,哈希表主要用于对数据的出现次数统计,查重。利用的容器主要有vector、map/set、ordered_map/ordered_set等。   下面我们来看几道例题: class Solution { public:     vector<int> twoSum(vector<int>& nums, int target) {         unordered_map<int,int> hash;         for(int i=0;i<nums.size();i++){             int x=target-nums[i];             if(hash.

By Ne0inhk
【C语言】初阶算法相关习题(二)

【C语言】初阶算法相关习题(二)

个人主页:夜晚中的人海 文章目录 * ⭐一、两数之和 * 🏠二、珠玑妙算 * 🎡三、寻找奇数 * 🚀四、截取字符串 * 🎉五、寻找峰值 ⭐一、两数之和 题目描述:两数之和 解题思路: 1.先创建一个动态分配的数组ret,用于存储结果,其大小为numbersLen 2.使用一个外层循环遍历数组numbers,循环变量i从0到numbersLen - 1。如果当前值大于目标值,则跳过当前循环 3.对于每个i,使用一个内层循环从i + 1到numbersLen - 1,循环变量j用于查找与numbers[i]相加等于target的另一个数字 4.若sum等于目标值target,则找到了满足条件的两个数字。将下标i和下标j分别+1存储到ret数组中*(题目要求下标从1开始) 5.设置returnSize为2,表示返回数组的大小,最后返回目标数组ret。若遍历完数组都没找到满足条件的两个数字,则返回0

By Ne0inhk

LeetCode 热题100快速通关指南(附模板) (优化完整版,真人心得版,持续更新)

LeetCode 热题100快速通关指南 (优化完整版) 前提要点:此文本提供了基本完善的模块,可用于刷题记录,总结教训等。 建议复制下来粘贴进自己的md笔记软件,每个章节包含模板,题目记录和真人心得部分。可以自行个性化更改,每个人都有自己的节奏,经验,教训,总结,方法。系统的记录可以进行系统化。 目录 1. 哈希(Hash) 2. 双指针(Two Pointers) 3. 滑动窗口(Sliding Window) 4. 子串(Substring) 5. 普通数组(Array) 6. 矩阵(Matrix) 7. 链表(Linked List) 8. 二叉树(Binary Tree) 9. 图论(Graph) 10.

By Ne0inhk