【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,然后继续向前复写。

三、代码展示

java 复制代码
class Solution {
    public void duplicateZeros(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) 常数空间复杂度的最优表现。其中"先确定边界、再逆向操作"的思路,是解决数组原地修改类问题的关键技巧,具有较强的通用性与实用性。


相关推荐
Boop_wu1 天前
[Java 算法] 字符串
linux·运维·服务器·数据结构·算法·leetcode
SkyXZ~1 天前
Jetson有Jtop,Linux有Htop,RDK也有Dtop!
linux·运维·服务器·rdkx5·rdks100·dtop
starvapour1 天前
Ubuntu系统下基于终端的音频相关命令
linux·ubuntu·音视频
杨云龙UP1 天前
Oracle Data Pump实战:expdp/impdp常用参数与导入导出命令整理_20260406
linux·运维·服务器·数据库·oracle
浪客灿心1 天前
线程同步与互斥
linux
6Hzlia1 天前
【Hot 100 刷题计划】 LeetCode 42. 接雨水 | C++ 动态规划与双指针题解
c++·算法·leetcode
abant21 天前
leetcode 114 二叉树变链表
算法·leetcode·链表
牛马鸡niumasi1 天前
C/C++ 程序编译过程、静态/动态链接、静态/动态库
linux
冬奇Lab1 天前
相机拍照流程:从快门按下到JPEG存储的完整旅程
android·音视频开发·源码阅读
alexhilton1 天前
在Compose中用Shader实现透明的粘稠元球效果
android·kotlin·android jetpack