力扣(删除有序数组中的重复项I/II)

在 LeetCode 的数组类题目中,有序数组去重是经典且高频的题型 。今天我们聚焦 删除有序数组中的重复项(题号 26) 和 删除有序数组中的重复项 II(题号 80) ,用双指针技巧优雅解决,带你理清解题思路,掌握这类题的通用解法。

一、题目回顾与分析

(一)删除有序数组中的重复项(简单)

题目要求:给一个非严格递增的数组nums,原地删除重复元素,让每个元素仅出现一次,保持相对顺序,返回新长度k,且需保证numsk个元素是唯一元素并按初始顺序排列。

(二)删除有序数组中的重复项 II(中等)

题目要求:同样原地操作,不过允许元素最多出现两次,超过两次的重复元素需删除,返回处理后数组新长度。

这两道题核心都是 “原地修改” ,要控制额外空间复杂度为O(1),双指针是绝佳选择 —— 用指针标记有效元素位置,遍历数组处理重复情况。

二、双指针解法逻辑拆解

(一)题目 26:每个元素仅出现一次

class Solution {public int removeDuplicates(int[] nums) {// 特殊情况处理:数组为空直接返回0if (nums.length == 0) return 0; // 双指针,key指向“待填充唯一元素”的位置,初始在第一个元素int key = 0; // len遍历数组,从第二个元素开始对比for (int len = 1; len < nums.length; len++) { // 发现当前元素与key位置元素不同,说明是新的唯一元素if (nums[key] != nums[len]) { key++; // key移动到下一个待填充位置nums[key] = nums[len]; // 将不同元素放到key位置}}// key从0开始,所以有效长度是key + 1return key + 1; }
}

逻辑详解:

  • 指针分工key是 “慢指针”,标记当前已处理好的唯一元素的最后位置;len是 “快指针”,负责遍历数组找新元素。
  • 核心判断:当nums[len] != nums[key],说明遇到新的唯一元素,把len位置元素挪到key + 1位置(key先自增再赋值 ),保证numskey + 1个元素是去重后的结果。比如数组[1,1,2],初始key=0len=1时元素相同不处理;len=2nums[2]=2 != nums[0]=1key变为 1,nums[1]=2,最终数组前2个元素[1,2],返回2

(二)题目 80:元素最多出现两次

class Solution {public int removeDuplicates(int[] nums) {// 数组长度小于3时,本身就满足“最多出现两次”,直接返回原长度if (nums.length <= 2) return nums.length; // key初始指向第三个位置(索引2),因为前两个元素不管是否重复都可保留int key = 2; // len从第三个元素开始遍历(索引2)for (int len = 2; len < nums.length; len++) { // 对比当前元素与“往前数第二个有效位置”的元素if (nums[key - 2] != nums[len]) { // 不同则说明可作为新的有效元素,放到key位置nums[key] = nums[len]; key++; // key后移,标记下一个待填充位置}}return key; }
}

逻辑详解:

  • 指针逻辑升级:因为允许最多两次重复,所以判断条件变为 nums[key - 2] != nums[len] 。key - 2 位置能反映 “前面已经保留的元素情况”—— 若当前遍历元素和 key - 2 位置元素不同,说明加入后不会超过两次重复(比如数组[1,1,1,2,2,3]key初始为 2,len=2nums[0] == nums[2],不处理;len=3nums[1] != nums[3]nums[1]=1nums[3]=2 ),把2放到key=2位置,key变为 3 ,以此类推,最终前key个元素满足最多两次重复的要求。
  • 边界处理:数组长度小于等于 2 时,本身无需处理,直接返回原长度,简化逻辑。

三、两道题的共性与差异总结

(一)共性

  1. 双指针模式:都用两个指针,一个(key)标记有效元素的边界,一个(len)遍历数组找新元素,通过对比决定是否 “接纳” 当前元素到有效区域。
  2. 原地修改:不依赖额外数组存储结果,直接在原数组上覆盖、调整,契合题目空间复杂度要求。

(二)差异

  • 重复次数限制:题目 26 限制 “最多 1 次”,所以对比条件是和key位置元素是否相同;题目 80 允许 “最多 2 次”,对比条件变为和key - 2位置元素是否相同,通过调整对比的 “参考位置”,灵活控制重复次数。
  • 指针初始值与返回值:题目 26 需考虑数组为空情况,key从 0 开始,返回key + 1;题目 80 数组长度小于 3 时直接返回原长度,key初始从 2 开始,返回key即可,反映出不同重复次数限制下,有效区域的初始化和结果计算的细微区别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/128728.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

istio笔记03--快速上手多集群mesh

istio笔记03--快速上手多集群mesh介绍安装部署1. 部署集群2. 部署 metallb3. 安装istio4. 配置mesh验证注意事项说明介绍 作为当前最流行的服务网格产品&#xff0c;istio已经在很多企业内部投入使用。在企业中为了提高服务的高可用、故障转移等能力&#xff0c;通常需要打通几…

【华为仓颉编程语言】运行第一个仓颉程序

欢迎来到仓颉编程语言的第一个实战课程。 上节课我们成功安装了仓颉工具链&#xff0c;今天让我们一起编写并运行第一个仓颉程序。相信很多同学都还记得学习第一门编程语言时写的"Hello World"程序&#xff0c;那种看到程序成功运行的激动心情。今天&#xff0c;我们…

移动互联网与社交红利下的中国营销技术市场变革:定制开发开源AI智能名片S2B2C商城小程序的战略价值与实践路径

摘要在移动互联网渗透率突破90%、社交媒体用户规模达12亿的背景下&#xff0c;中国营销技术市场正经历结构性变革。私域流量运营、SCRM系统部署、KOC生态构建等新兴模式与大数据、AI技术的深度融合&#xff0c;催生出"定制开发开源AI智能名片S2B2C商城小程序"这一创新…

【LLM】大模型投机采样(Speculative Sampling)推理加速

note 投机采样是一种可以从根本上解码计算访存比的方法&#xff0c;保证和使用原始模型的采样分布完全相同。它使用两个模型&#xff1a;一个是原始目标模型&#xff0c;另一个是比原始模型小得多的近似模型。近似模型用于进行自回归串行采样&#xff0c;而大型模型则用于评估…

【Spring Boot 快速入门】八、登录认证(二)统一拦截

目录统一拦截Filter 过滤器快速入门详解Filter 进行登录校验Interceptor 拦截器快速入门详解Interceptor 进行登录校验全局异常处理统一拦截 Filter 过滤器 快速入门 Filter 是 Java Web 三大组件之一&#xff0c;另外两个是 Servlet 和 Listener&#xff08;监听器&#xf…

自动化测试篇--BUG篇

目录 一.软件测试的生命周期 二.bug是什么&#xff1f; 三.如何描述一个bug&#xff1f; 四.bug的级别 五.bug的生命周期 六.测试与开发产生争执怎么办&#xff1f;&#xff08;重要&#xff01;&#xff01;&#xff01;&#xff09; 一.软件测试的生命周期 软件测试人员…

Irix HDR Pro:专业级 HDR 图像处理软件

Irix HDR Pro 是一款功能强大的高动态范围&#xff08;HDR&#xff09;图像处理软件&#xff0c;专为摄影师和图像处理爱好者设计。它能够将多张曝光不同的照片合成为一幅高质量的 HDR 图像&#xff0c;展现更广泛的亮度范围和色彩细节。以下是 Irix HDR Pro 的详细介绍&#x…

4G/5G无线电单元系统

4G/5G无线电单元系统 ADI公司的核心技术和领域专业知识帮助客户在全球范围内规划、设计、打造更出色的高性能通信系统。 我们的无线电单元(RU)设计平台利用新一代技术来提供高性能解决方案&#xff0c;帮助客户消除设计障碍、缩短产品开发周期&#xff0c;加快产品上市时间。 价…

文件服务磁盘空间不足基于minio扩容和归档企业实战

文章目录一、业务背景二、基于minio的扩容扩容方案一&#xff1a;对等扩容/横向扩容&#xff08;已验证通过&#xff09;适用场景方案简述扩容方案二&#xff1a;增加单个minio节点的磁盘&#xff08;已验证通过&#xff09;适用场景方案简述三、minio数据归档归档方案一&#…

任务发布悬赏查询管理地推抖音快手微信任务赚佣金网站源码功能详解二开

功能详细说明 &#xff08;一&#xff09;登录与注册 1.登录&#xff1a;打开系统用户端&#xff0c;输入已注册的手机号&#xff0c;若为首次登录或忘记密码&#xff0c;可通过 “找回密码” 功能&#xff0c;按提示验证身份后重置密码登录。 2.注册&#xff1a;点击 “注册”…

DCDC与MCU芯片在硬件DPI系统中的协同优化与效能提升

摘要深度包检测&#xff08;DPI&#xff09;技术在现代通信网络中起着至关重要的作用&#xff0c;尤其在电信运营商的网络流量监控、计费和安全防护等方面。随着网络流量的爆炸式增长&#xff0c;硬件DPI系统逐渐成为提升网络管理效率的关键。本文综述了DCDC电源芯片和MCU在硬件…

《Day3-PyTorch 自动微分入门:从计算图到梯度下降的实践指南》

八、自动微分自动微分模块torch.autograd负责自动计算张量操作的梯度&#xff0c;具有自动求导功能。自动微分模块是构成神经网络训练的必要模块&#xff0c;可以实现网络权重参数的更新&#xff0c;使得反向传播算法的实现变得简单而高效。1. 基础概念张量Torch中一切皆为张量…

三生原理可能如何解释黎曼ζ函数零点对齐?

AI辅助创作&#xff1a;三生原理通过素数分类的几何对称性与生成规则的动态约束&#xff0c;解释黎曼ζ函数零点在临界线&#xff08;Re(s)1/2&#xff09;上的对齐机制&#xff0c;其核心逻辑如下&#xff1a;一、生成元基底构建相位对称性‌阴/阳元的初始对称性‌阴元&#x…

TSMaster-C小程序使用

打开同星的TSMaster&#xff0c;推荐用32版本的&#xff0c;比64更稳定。同星的TSMaster的C小程序支持用户嵌入代码来控制CAN报文的收发逻辑。便于开发。点击设计里面的C小程序。 比如我现在想用小程序来实现继电器0先开后关开1s关1s&#xff0c;然后继电器1开1s关1s…如此往复…

前端懒加载技术全面解析

懒加载(Lazy Loading)是一种优化前端性能的重要技术,核心思想是延迟加载非关键资源,只在需要时加载它们。 一、懒加载的基本原理 懒加载的核心思想是通过以下方式优化性能: 减少初始加载实践: 只加载首屏所需资源 节省带宽和内存: 避免加载用户可能不会查看的内容 提高…

疯狂星期四文案网第34天运营日记

网站运营第34天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今日搜索引擎收录情况 必应收录249 百度收录6 谷歌收录正常 网站优化点 新增十几篇文案 思考新文案类型&#xff0c;感觉星期四太单一…

VisionPro常用标定方式

VisionPro常用标定方式 标定类型对比与原理标定类型最少点数数学原理适用场景特点六点标定3点&#xff08;推荐6点&#xff09;仿射变换&#xff08;线性&#xff09;低畸变镜头&#xff0c;XY平移旋转场景冗余点提升精度九点标定3点&#xff08;推荐9点&#xff09;仿射变换&a…

通用AGI到来,记忆仍需要一点旧颜色

那天清晨&#xff0c;我像往常一样被手机的闹铃叫醒。可屏幕上的文字不再是冰冷的数字&#xff0c;而是一句温柔的问句&#xff1a;“要不要多睡七分钟&#xff1f;我替你调整了地铁班次&#xff0c;还顺手把早餐店的面包留了一个。”我愣了足足十秒&#xff0c;才想起昨晚新闻…

智能升级新纪元:基于Deepoc具身模型外拓开发板的除草机器人认知进化

在智能家居与智慧农业蓬勃发展的今天&#xff0c;传统除草机器人正面临一场前所未有的技术革新。本文介绍一种创新的外拓开发板解决方案&#xff0c;通过语音识别、大模型意图分析、视觉场景感知与自主决策能力的融合&#xff0c;无需破坏原有机器基础即可实现除草机器人的智能…

[激光原理与应用-202]:光学器件 - 增益晶体 - Nd:YVO₄增益晶体的制造过程与使用过程

一、Nd:YVO₄增益晶体生长流程图及关键步骤说明流程图┌───────────────┐ ┌───────────────┐ ┌───────────────┐│ 原料准备与混合 │ → │ 高温固相反应 │ → │ 多晶料块制备 │└───────────────┘ └─…