当前位置: 首页 > news >正文

算法:删除有序数组的重复项

📑 删除有序数组的重复项

  • 题目描述
  • 形象的比喻:搬家整理书架
  • for循环解法
  • while循环解法

题目描述

给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。

考虑nums的唯一元素的数量为k,你需要做以下事情:

  • 更改数组nums,使nums的前k个元素包含唯一元素,并按照它们最初在nums中出现的顺序排列。
  • nums的其余元素与nums的大小不重要。
  • 返回k

示例 1:

输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4,_,_,_,_,_] 解释:函数应该返回新的长度 5 ,并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

通俗解释

想象一下你在搬家,需要整理书架上的书。书架上的书已经按作者姓氏的字母顺序排列好了,但有些作者有多本书(重复项)。

你的任务是:

  1. 把每个作者的第一本书保留在书架上
  2. 把重复的作者书籍放到箱子里(不需要管)
  3. 最后书架上的书都是不重复的,且保持原来的顺序

具体操作:

  • 你从书架的第二本书开始检查(第一本肯定要保留)
  • 如果当前书和前面保留的书是同一个作者,就把它放到箱子里
  • 如果当前书是新的作者,就把它放到保留区的下一位置
  • 最后数一数保留区有多少本书

这就是双指针算法的生动比喻!


for循环解法

classSolution{publicintremoveDuplicates(int[]nums){// 边界情况:如果数组为空或者只有一个元素,直接返回长度即可if(nums==null||nums.length==0){return0;}// 1. 定义慢指针 (slow)// 它的含义是:[0, slow] 闭区间内的元素都是不重复的、整理好的// 初始时,第0个位置的元素肯定要保留,所以 slow 从 0 开始intslow=0;// 2. 定义快指针 (fast),开始遍历// 从索引 1 开始,因为索引 0 的元素我们已经默认放进去了for(intfast=1;fast<nums.length;fast++){// 3. 核心逻辑:对比// 如果快指针指向的数,和慢指针指向的数不一样// 说明遇到了一个"新数字"if(nums[fast]!=nums[slow]){// 4. 慢指针先向右挪一步,腾出位置放新书slow++;// 5. 把快指针找到的新书,放到慢指针的位置// (其实这里可以直接赋值,因为题目只要求前k个有序且不重复)nums[slow]=nums[fast];}// 如果一样,什么也不做,快指针继续跑,相当于把重复的书扔进了垃圾桶}// 6. 返回新数组的长度// 因为索引是从0开始的,所以长度要 +1returnslow+1;}}

while循环解法

这是我自己的写法,也通过了

publicintremoveDuplicates(int[]nums){intslow=0;//慢指针intfast=slow+1;//快指针intresult=1;while(j<nums.length){if(nums[slow]!=nums[fast]){//根据题意:result的当前个数就是新数组的下标nums[result]=nums[fast];//计数+1result++;//慢指针移到快指针的位置slow=fast;}fast++;}returnresult;}
http://www.jsqmd.com/news/1096517/

相关文章:

  • Web身份验证漏洞攻防实战:从暴力破解到MFA绕过的全面防御指南
  • 从CT灰度到力学模型:Mimics中股骨多材料属性赋予的完整实践
  • STM32F407ZET6 SysTick延时:从寄存器配置到传感器精准触发的实战解析
  • 抖音直播录制神器:3步快速部署40+平台自动录制完整指南
  • VMware运维工具箱:从RVTools到PowerCLI的实战利器盘点
  • TinyML 推理引擎:从模型量化到 MCU 级部署的极致内存优化
  • 你玩的游戏,可能正在帮外国军队扫描你的国家
  • 【万字文档+源码】基于springboot+vue茶叶商城管理系统-可用于毕设-课程设计-练手学习-学习资料分享
  • Delphi 实战:从阻塞到流式,解锁OpenAI API异步调用与实时响应
  • 英雄联盟Akari助手:3分钟快速上手的游戏效率工具终极指南
  • 一行命令让 AI Agent 看遍全网:Agent-Reach 全平台数据源扩展实战
  • 从 1 台到 10 台:无人售货柜的规模化复制
  • Windows 11 系统盘越用越小怎么办?存储感知 DISM Compact OS 等专属工具详解
  • 论文AI写作软件推荐哪个好?2026年度榜单
  • WWW 2024 | 图嵌入新范式:从LINE到大规模动态网络的表示学习
  • 在Java中,如何使用break和continue关键字来控制循环?
  • 记录redis学习
  • 别再硬编码密钥了!Spring Boot项目实战:用配置文件安全管理AES256加解密密钥
  • 大模型 AGI 开发模式:从概念到落地的系统性技术解构
  • STC16F40K128单片机驱动4路红外循迹模块实战指南
  • HarmonyOS7 泛型组件怎么写才不废?TypeScript 类型安全通用列表实战
  • 终极指南:如何用Python免费下载B站大会员4K高清视频
  • 网络基础入门与实战操作指南
  • 终极指南:如何用MPC-HC打造专业级Windows媒体播放体验 [特殊字符]
  • 一键下载中小学电子课本:国家中小学智慧教育平台PDF下载工具完全指南
  • 海量简历筛选太痛苦?实测AI智能体批量归档黑科技,猎头效能提升10倍
  • 解锁B站缓存视频:m4s-converter工具完整使用指南
  • 同步与异步通信:从概念到实战,如何为你的系统选择最佳通信模式?
  • 进口气动三通调节阀:工业流体合/分流控制怎么选-米勒阀门
  • 从“AI辅助”到“AI协同”:一线大厂已上线的代码生成可信度分级标准(含自动校验插件开源地址)