news 2026/5/7 22:57:33

2.LeetCode 1089. 复写零——双指针解法学习笔记

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2.LeetCode 1089. 复写零——双指针解法学习笔记

目录

一、题目解析

二、算法原理:双指针法

步骤1:找最后一个“复写”的数

步骤2:处理边界情况

步骤3:从后往前复写

三、代码实现(Java)

四、复杂度分析

五、总结


OJ链接:https://leetcode.cn/problems/duplicate-zeros/description/

今天学习了LeetCode第1089题《复写零》,这道题要求我们在长度固定的数组里,把每个0都复写一遍(也就是变成两个0),其他元素向右平移,而且不能超出数组长度。题目还强调要就地修改,不返回新数组。下面我把思路理清楚~

一、题目解析

先看题目描述:给定整数数组arr,将出现的每个0复写一遍(比如[1,0,2]变成[1,0,0,2]?但数组长度固定,所以超出的元素会被截断),其余元素右移。注意不要越界写入,就地修改。

举个例子:

  • 示例1:输入arr = [1,0,2,3,0,4,5,0],输出[1,0,0,2,3,0,0,4](因为最后一个0复写后超出长度,所以只保留前面的部分)。

  • 示例2:输入arr = [1,2,3],输出[1,2,3](没有0,所以不变)。

二、算法原理:双指针法

笔记里说,先想“异地”操作(比如新建一个数组来放结果),再优化成“就地”的双指针操作。核心是找到最后一个需要复写的0的位置,然后从后往前填充。

步骤1:找最后一个“复写”的数

用两个指针:cur(遍历原数组)和dest(记录复写后的位置)。

  • 如果arr[cur]是0,dest加2(因为0要复写,占两个位置);

  • 如果arr[cur]不是0,dest加1(占一个位置);

  • dest超过或等于数组长度n-1时,停止(说明找到最后一个需要复写的数了)。

步骤2:处理边界情况

如果dest刚好等于n(比如数组最后一个元素是0,复写后dest会到n),这时候要把最后一个位置设为0,然后curdest回退(cur--dest -= 2)。

步骤3:从后往前复写

现在cur指向最后一个需要复写的数,dest指向结果数组的最后一个位置。从后往前遍历:

  • 如果arr[cur]不是0,就把arr[cur]放到dest位置,然后cur--dest--

  • 如果arr[cur]是0,就把0放到destdest-1位置(复写),然后cur--dest -= 2

三、代码实现(Java)

代码很清晰,看:

class Solution { public void duplicateZeros(int[] arr) { int cur = 0, dest = -1, n = arr.length; // 1. 先找到最后一个需要复写的数 while (cur < n) { if (arr[cur] == 0) { dest += 2; } else { dest += 1; } if (dest >= n - 1) { break; } cur++; } // 2. 处理边界情况(比如最后一个元素是0,复写后dest超了) if (dest == n) { arr[n - 1] = 0; cur--; dest -= 2; } // 3. 从后向前完成复写操作 while (cur >= 0) { if (arr[cur] != 0) { arr[dest--] = arr[cur--]; } else { arr[dest--] = 0; arr[dest--] = 0; cur--; } } } }

四、复杂度分析

  • 时间复杂度:O(N),因为curdest都只遍历数组一次(最多两次,但总体是线性)。

  • 空间复杂度:O(1),就地修改,没有额外空间。

五、总结

这道题的关键是双指针找位置+从后往前填充。一开始可能会想新建数组,但题目限制了就地修改,所以用双指针先确定最后一个复写的数的位置,再从后往前填,避免了元素覆盖的问题。一定要手动模拟一遍过程,就能理解curdest的移动逻辑啦~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 22:55:43

使用OpenClaw构建AI智能体时配置Taotoken作为提供商

使用OpenClaw构建AI智能体时配置Taotoken作为提供商 1. 准备工作 在开始配置之前&#xff0c;请确保已安装OpenClaw框架并完成基本环境搭建。同时需要在Taotoken平台获取有效的API Key&#xff0c;该Key可在Taotoken控制台的"API密钥管理"页面创建。建议为OpenClaw…

作者头像 李华
网站建设 2026/5/7 22:55:40

本土化赋能:Gitee如何重塑中国开发者的代码托管体验

在数字化转型加速的今天&#xff0c;代码托管平台已成为企业技术基础设施的重要组成部分。对于中国开发者而言&#xff0c;一个能够兼顾性能、合规与本地化支持的平台显得尤为重要。Gitee作为国内领先的代码托管服务&#xff0c;正通过其独特的本土化优势&#xff0c;为开发者提…

作者头像 李华
网站建设 2026/5/7 22:55:35

中国词元:构建自主AI生态的“云-端“协同战略

在全球化AI竞赛进入白热化的今天&#xff0c;中国科技企业正在探索一条独特的突围路径。当国际科技巨头通过封闭云帝国垄断AI基础设施时&#xff0c;中国产业界提出了"中国词元"的创新概念——通过整合本土模型、国产算力和绿色能源&#xff0c;构建自主可控的AI生态…

作者头像 李华
网站建设 2026/5/7 22:53:35

08-MLOps与工程落地——模型注册表与模型服务

模型注册表与模型服务&#xff08;MLflow Model Registry、Seldon Core&#xff09; 一、模型注册表概述 1.1 什么是模型注册表&#xff1f; import matplotlib.pyplot as plt from matplotlib.patches import Rectangle, FancyBboxPatch import warnings warnings.filterwarni…

作者头像 李华
网站建设 2026/5/7 22:51:35

5步掌握TIDAL高品质音乐下载:tidal-dl-ng高效使用指南

5步掌握TIDAL高品质音乐下载&#xff1a;tidal-dl-ng高效使用指南 【免费下载链接】tidal-dl-ng TIDAL Media Downloader Next Generation! Up to HiRes / TIDAL MAX 24-bit, 192 kHz. 项目地址: https://gitcode.com/gh_mirrors/ti/tidal-dl-ng 想要永久保存TIDAL平台上…

作者头像 李华