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

力扣(删除有序数组中的重复项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.dtcms.com/a/322823.html

相关文章:

  • [优选算法专题一双指针——四数之和]
  • 配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
  • Java 8特性(一)
  • 新手向:Python开发简易待办事项应用
  • 顺风车软件系统架构分析
  • 大语言模型提示工程与应用:ChatGPT提示工程技术指南
  • PDF编辑工具,免费OCR识别表单
  • ST语法介绍
  • GloVe词向量:原理详解及用python进行训练和应用GloVe
  • 【第四章:大模型(LLM)】05.LLM实战: 实现GPT2-(1)文本token到Embedding的代码实现
  • 【数据分享】各省农业土地流转率(2010-2023)
  • Easysearch 冷热架构实战
  • 分治-快排-面试题 17.14.最小k个数-力扣(LeetCode)
  • Redhat Linux 9.6 配置本地 yum 源
  • 【数据结构入门】栈和队列
  • 网盘短剧资源转存项目源码 支持垮克 带后台 附教程
  • Kafka服务端NIO操作原理解析(二)
  • MX 播放器:安卓设备上的全能视频播放器
  • 【解决方法】华为电脑的亮度调节失灵
  • 本地部署接入 whisper + ollama qwen3:14b 总结字幕
  • 服务机器人选择屏幕的逻辑
  • 微软推出革命性AI安全工具Project IRE,重塑网络安全防御新范式
  • Orange的运维学习日记--37.iSCSI详解与服务部署
  • FreeRTOS学习笔记:任务通知和软件定时器
  • jQuery 零基础学习第一天
  • 数据结构—二叉树及gdb的应用
  • 【贪心】P4873 [USACO14DEC] Cow Jog G|省选-
  • MBR分区nvme固态硬盘安装win7--非UEFI启动和GPT分区
  • llm本地部署+web访问+交互
  • Oracle字段操作