【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

2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle)

2025最新版 Android Studio安装及组件配置(SDK、JDK、Gradle)

目录 * 原生 Android 简介 * Android Studio必备组件 * 一、Android Studio安装 * 二、Android SDK 配置 * 三、JDK 配置(选做) * 四、Gradle 配置 * 五、新项目测试 原生 Android 简介 Android 是由 Google 开发的移动操作系统,而“原生 Android 开发”指的是直接使用 Java 或 Kotlin 语言,以及 Android SDK,来为这个操作系统构建应用程序。是深耕 Android 生态、追求极致性能和系统集成的选择,其市场份额和应用基础极为庞大。 Android Studio必备组件 在安装之前我们必须要清楚原生Android开发,

By Ne0inhk
Java 部署:跨环境部署(开发 / 测试 / 生产配置隔离)

Java 部署:跨环境部署(开发 / 测试 / 生产配置隔离)

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Java部署这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * Java 部署:跨环境部署(开发 / 测试 / 生产配置隔离) 🚀 * 为什么需要跨环境配置隔离?🤔 * Spring Boot 中的 Profile 机制:最常用的隔离方案 🌈 * 1. 创建 Profile 特定的配置文件 * 示例:通用配置(application.yml) * 示例:开发环境配置(application-dev.yml) * 示例:生产环境配置(application-prod.yml) * 2. 激活 Profile * 方式一:启动参数 * 方式二:环境变量 * 方式三:application.

By Ne0inhk
飞算JavaAI—AI编程助手 | 编程领域的‘高科技指南针’,精准导航开发!

飞算JavaAI—AI编程助手 | 编程领域的‘高科技指南针’,精准导航开发!

目录 一、引言 1.1 什么是飞算JavaAI? 1.2 告别"996的孤独感":AI成为你的编码搭子 1.3 成就感加速器:从"能运行"到"优雅实现" 1.4 极简下载体验:3步开启"开挂"模式 二、深入体验飞算JavaAI——智能引导 2.1 一键生成完整工程代码 2.2 合并项目 【本地化智能分析与精准分析老项目】 【自动关联项目与生成专属工程规范】 【模块化智能引导与精准控制接口】 【全局集成与精细化管理】 三、其他功能 3.1 Java

By Ne0inhk
Flutter 三方库 js_wrapping 的鸿蒙化适配指南 - 实现 Dart 与 JavaScript 的无缝对象包装、支持强类型回调与属性映射

Flutter 三方库 js_wrapping 的鸿蒙化适配指南 - 实现 Dart 与 JavaScript 的无缝对象包装、支持强类型回调与属性映射

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 js_wrapping 的鸿蒙化适配指南 - 实现 Dart 与 JavaScript 的无缝对象包装、支持强类型回调与属性映射 前言 在进行 Flutter for OpenHarmony 的 Web 混合开发时,频繁地在 Dart 层与底层 JavaScript 环境进行数据交互是不可避免的。虽然官方提供了基本的 dart:js,但在处理复杂的 JS 对象和回调时,代码往往会变得杂乱无章。js_wrapping 提供了一个更优雅的、类型安全的包装层。本文将指导大家如何在鸿蒙端利用该库提升 JS 互操作的开发体验。 一、原理解析 / 概念介绍 1.1 基础原理

By Ne0inhk