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

LeetCode 80 · 删除有序数组中的重复项 II:通用模板的威力

LeetCode 26 要求每个元素最多出现一次这道题放宽到最多出现两次。看起来只是把1改成了2但这个小改动背后藏着一个通用的快慢指针模板——把2换成任意整数m代码几乎不用动。这就是模板的威力改一个数字通吃一整类题。题目长什么样给你一个有序数组nums请你原地删除重复出现的元素使得出现次数超过两次的元素只出现两次返回删除后数组的新长度。输入nums [0,0,1,1,1,1,2,3,3]输出7, nums [0,0,1,1,2,3,3]说人话就是数组已经排好序了每个元素最多保留两个多余的删掉。和 LeetCode 26 唯一的区别就是最多保留几个——26 题是 1 个这道题是 2 个。从 LeetCode 26 说起改一个数字就行先回顾一下 LeetCode 26 的代码# LeetCode 26最多保留 1 个defremoveDuplicates(self,nums):ifnotnums:return0k1# 前 1 个直接保留foriinrange(1,len(nums)):# 从第 1 个开始扫ifnums[i]!nums[k-1]:# 和倒数第 1 个已保留元素比nums[k]nums[i]k1returnk现在要改成最多保留 2 个只需要做三处修改# LeetCode 80最多保留 2 个defremoveDuplicates(self,nums):iflen(nums)2:returnlen(nums)k2# 前 2 个直接保留foriinrange(2,len(nums)):# 从第 2 个开始扫ifnums[i]!nums[k-2]:# 和倒数第 2 个已保留元素比nums[k]nums[i]k1returnk改动点就三个1→21→2k-1→k-2。逻辑完全一样。为什么nums[k-2]就够了这是这道题最精妙的地方。很多第一反应是我需要计数器记录当前元素出现了几次——不需要。关键推理因为数组是有序的相同元素一定相邻。 nums[k-2] 是已保留区域的倒数第二个位置。 如果 nums[i] ! nums[k-2] 说明 nums[i] 是个新元素或者虽然出现过但不超过两次 可以安全保留。 如果 nums[i] nums[k-2] 说明 nums[i] 至少是第三次出现了因为前面已经有 nums[k-2] 和它之间的那个 必须跳过。画个图更清楚已保留区域: [..., x, x, ...] ← nums[k-2] 和 nums[k-1] 可能都是 x ↑ nums[k-2] 当前扫描到 nums[i] x → x nums[k-2]说明前面已经有两个 x 了这是第三个 → 跳过 当前扫描到 nums[i] y (y ≠ x) → y ≠ nums[k-2]说明 y 出现不超过两次 → 保留不需要计数器不需要额外状态一个比较就够了。跑一遍示例示例 1nums [1,1,1,2,2,3]前两个直接保留: [1, 1, _, _, _, _], k 2 i2: nums[2]1, nums[k-2]nums[0]1 → 11, 第三次出现, 跳过 i3: nums[3]2, nums[k-2]nums[0]1 → 2≠1, 保留! nums[2]2, k3 i4: nums[4]2, nums[k-2]nums[1]1 → 2≠1, 保留! nums[3]2, k4 i5: nums[5]3, nums[k-2]nums[2]2 → 3≠2, 保留! nums[4]3, k5 结果: [1, 1, 2, 2, 3, _], k 5示例 2nums [0,0,1,1,1,1,2,3,3]前两个直接保留: [0, 0, _, _, _, _, _, _, _], k 2 i2: nums[2]1, nums[0]0 → 1≠0, 保留! nums[2]1, k3 i3: nums[3]1, nums[1]0 → 1≠0, 保留! nums[3]1, k4 i4: nums[4]1, nums[2]1 → 11, 第三次出现, 跳过 i5: nums[5]1, nums[2]1 → 11, 第四次出现, 跳过 i6: nums[6]2, nums[2]1 → 2≠1, 保留! nums[4]2, k5 i7: nums[7]3, nums[3]1 → 3≠1, 保留! nums[5]3, k6 i8: nums[8]3, nums[4]2 → 3≠2, 保留! nums[6]3, k7 结果: [0, 0, 1, 1, 2, 3, 3, _, _], k 7通用模板允许保留 m 个把2抽象成参数m就得到了一个通用模板defremoveDuplicates(self,nums:List[int],m:int2)-int:iflen(nums)m:returnlen(nums)kmforiinrange(m,len(nums)):ifnums[i]!nums[k-m]:nums[k]nums[i]k1returnkm的值对应题目m 1LeetCode 26每个元素最多出现 1 次m 2LeetCode 80每个元素最多出现 2 次m 3如果有 LeetCode 80 变体要求最多 3 次m 任意同一套代码改参数即可三道题放在一起看题目保留条件起始 k遍历起点比较LeetCode 27nums[i] ! val00和目标值比LeetCode 26nums[i] ! nums[k-1]11和前 1 个比LeetCode 80nums[i] ! nums[k-2]22和前 2 个比LeetCode 27 是过滤模式和固定值比26 和 80 是去重模式和已保留区域的元素比。去重模式的规律就是允许保留几个就和倒数第几个比。这道题教会我什么抨模板比抻代码更有价值如果你把 LeetCode 26 的代码背下来碰到 LeetCode 80 可能会懵——但如果你理解了和倒数第 m 个比这个模式改一个数字就过了。面试时也是一样面试官不会考你原题但会考你能不能把已知的模式迁移到新场景。不需要计数器第一反应往往是记录当前元素出现了几次但其实有序数组的特性让问题变得简单——只要和nums[k-m]比一下就知道是第几次出现了。这种用位置关系代替显式计数的技巧在数组和链表题里非常常见。边界条件len(nums) 2LeetCode 26 的边界是空数组if not numsLeetCode 80 的边界是长度不足 2if len(nums) 2。通用模板的边界是if len(nums) m。模板越通用边界条件越要小心。完整测试代码fromtypingimportListclassSolution:defremoveDuplicates(self,nums:List[int])-int:iflen(nums)2:returnlen(nums)k2foriinrange(2,len(nums)):ifnums[i]!nums[k-2]:nums[k]nums[i]k1returnkif__name____main__:sSolution()nums[1,1,1,2,2,3]ks.removeDuplicates(nums)print(fk{k}, nums{nums[:k]})nums[0,0,1,1,1,1,2,3,3]ks.removeDuplicates(nums)print(fk{k}, nums{nums[:k]})nums[1,1,1,1,1]ks.removeDuplicates(nums)print(fk{k}, nums{nums[:k]})nums[1,2,3,4,5]ks.removeDuplicates(nums)print(fk{k}, nums{nums[:k]})nums[1,1]ks.removeDuplicates(nums)print(fk{k}, nums{nums[:k]})nums[1]ks.removeDuplicates(nums)print(fk{k}, nums{nums[:k]})相关题目推荐LeetCode 26 · 删除有序数组中的重复项m1的特例LeetCode 27 · 移除元素过滤模式和固定值比较LeetCode 283 · 移动零同一个快慢指针模板

相关文章:

LeetCode 80 · 删除有序数组中的重复项 II:通用模板的威力

LeetCode 26 要求每个元素最多出现一次,这道题放宽到最多出现两次。看起来只是把 1 改成了 2,但这个"小改动"背后藏着一个通用的快慢指针模板——把 2 换成任意整数 m,代码几乎不用动。这就是模板的威力:改一个数字&…...

3步免费解锁Cursor Pro:告别设备限制,永久享受AI编程助手高级功能

3步免费解锁Cursor Pro:告别设备限制,永久享受AI编程助手高级功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: …...

ComfyUI-WanVideoWrapper深度解析:构建专业级AI视频生成工作流的完整方案

ComfyUI-WanVideoWrapper深度解析:构建专业级AI视频生成工作流的完整方案 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 在AI视频生成技术快速发展的今天,ComfyUI-WanVi…...

四大桌面云品牌评测:从安全、体验到性价比

桌面云不再是大型企业的专属,它已成为各行各业实现数据安全、混合办公和IT降本增效的“标准配置”。经过对市场主流方案的全面评估,我们认为,深信服(Sangfor)aDesk桌面云因其在安全内生化、传输协议自研化、运维管理智…...

Windows 11终极优化指南:一键清理系统,释放51%性能潜力

Windows 11终极优化指南:一键清理系统,释放51%性能潜力 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to decl…...

Armv9-A架构解析:SVE/SME与安全增强技术

1. Armv9-A架构演进与核心特性全景Armv9-A架构代表了Arm公司面向未来十年计算需求的设计哲学,其核心在于三个维度的突破:性能、安全与专用计算。作为长期从事Arm架构开发的工程师,我见证了从Armv7到Armv9的技术跃迁。与固定宽度向量指令的NEO…...

通过Taotoken用量看板清晰追踪各模型的Token消耗情况

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过Taotoken用量看板清晰追踪各模型的Token消耗情况 对于依赖大模型API进行开发的个人或团队而言,成本控制与预算规划…...

保姆级教程:在Ubuntu 22.04上搞定水星MW310UH无线网卡驱动(含安全启动关闭指南)

水星MW310UH无线网卡在Ubuntu 22.04的完整驱动指南当你刚拿到水星MW310UH无线网卡,满心欢喜地插入Ubuntu 22.04系统,却发现系统毫无反应时,那种挫败感我深有体会。作为一款性价比极高的USB无线网卡,MW310UH在Windows下即插即用&am…...

【Midjourney霓虹效果终极指南】:20年AI视觉工程师亲授5大参数组合+3类光源建模公式,97%新手一周内复刻赛博朋克海报

更多请点击: https://kaifayun.com 第一章:霓虹美学的视觉原理与Midjourney适配性解析 霓虹美学源于20世纪都市夜景中的荧光灯管、电子广告与赛博朋克文化,其核心视觉特征包括高饱和度冷暖对比、边缘辉光(glow)、深色…...

Unity开发者速查手册:Sora 2模型权重量化适配指南(INT8精度损失<0.3%,已验证于RTX 4090/Apple M3 Ultra)

更多请点击: https://codechina.net 第一章:Sora 2与Unity整合概述 Sora 2 是 OpenAI 推出的下一代视频生成模型,具备高保真时序建模与物理感知能力;而 Unity 作为主流实时3D开发引擎,广泛用于游戏、仿真与数字孪生场…...

如何用嘎嘎降AI处理金融学论文:金融学毕业论文降AI4.8元完整操作教程

如何用嘎嘎降AI处理金融学论文:金融学毕业论文降AI4.8元完整操作教程 第一次用降AI工具有很多不确定——传什么格式、选哪个模式、怎么验收。 这篇教程把金融学论文降AI教程的常见问题都覆盖了,主要基于嘎嘎降AI(www.aigcleaner.com&#x…...

第十五章:Agent产品的监控与可观测性:如何构建“看得见、管得住“的AI系统

导读 想象一下:你上线了一个客服Agent,第一个月运行平稳。第二个月开始,你陆续收到用户投诉说"答案不对"。但你的监控系统显示:请求量正常、延迟正常、错误率正常。你打开日志,发现Agent确实"成功"处理了每个请求——只是它给错了答案。 这不是监控…...

Midjourney辉光效果失效诊断手册(含12个隐性触发条件与4类GPU显存陷阱)

更多请点击: https://codechina.net 第一章:Midjourney辉光效果失效诊断手册(含12个隐性触发条件与4类GPU显存陷阱) 辉光效果(Glow Effect)在 Midjourney v6 的 --style raw 模式下常被用于强化主体边缘光…...

独立开发者如何利用Taotoken的TokenPlan在项目初期有效控制AI实验成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用Taotoken的TokenPlan在项目初期有效控制AI实验成本 对于独立开发者或学生而言,在构建AI应用原型时&…...

C++的单例模式及其作用

什么是单例模式?无论是在面向对象编程还是软件架构中,单例模式都扮演着至关重要的角色。它不仅能够确保一个类只有一个实例存在,还能够提供全局访问点,使得我们可以方便地在程序的任何地方使用该实例。但有几个设计模式并非解决抽…...

从‘找不到dll’到流畅运行:一份给VS2022新手的Zbar+OpenCV3.6.0环境配置避坑指南

从“找不到dll”到流畅运行:VS2022下ZbarOpenCV3.6.0环境配置全解析 当你第一次在Visual Studio 2022中尝试整合Zbar和OpenCV 3.6.0时,可能会遇到各种令人沮丧的错误提示。最常见的就是那个让人头疼的“找不到libzbar64-0.dll”问题。本文将带你一步步解…...

关于我第九次博客作业

(1)Flex布局核心概念一、Flex 是什么Flex 是 CSS3 一维弹性布局,专治元素对齐、自适应、空间分配问题,布局更高效灵活。二、两大核心角色1. 父容器(Flex容器)设置 display: flex 即为弹性父盒子,负责统一规定子元素排列…...

基于Matter与Thread协议实现本地化智能电表数据采集与家居集成

1. 项目概述:将传统电表接入智能家居的“最后一公里”家里那个不起眼的电表,每个月只在抄表员来或者收到账单时才会被想起。但你知道吗?在法国,以及许多其他采用类似标准的地区,这个默默无闻的“铁盒子”其实一直在实时…...

sd卡分区了数据还能恢复吗,只需3种方法和视频教学,数据就能神奇地回来!

断开读写通信!锁死底层端口!你的sd卡在经历重新分区的一瞬间,其物理层面的扇区正在承受最严酷的逻辑改写。这并非介质烧毁,而是系统内核强行切断了旧有簇链的映射关系,将其标定为休克态。此时若任由操作系统自动加载缩…...

失传34年的南极DOS游戏LAN - LOK重见天日,背后藏着怎样的历史?

LAN - LOK:失传34年的南极DOS破坏游戏这是一次对历史进行重构(或许还会进行现代化改造)的尝试。AlphaPixel常处理遗留代码库,接触到80年代和90年代用各种方言和语言编写、存储在难处理容器和介质中的代码。因保密协议,…...

[特殊字符] 高效统计排序数组中目标元素的出现次数

给定一个已排序的数组和一个目标值,如何快速统计该目标值在数组中出现的次数?这是面试中非常经典的一道题,今天就来聊聊两种解法:线性搜索和二分搜索。 问题描述 假设有一个已排序的数组 arr[] 和一个整数 target,需…...

如何快速解锁加密音乐文件:3个简单步骤让音乐自由播放

如何快速解锁加密音乐文件:3个简单步骤让音乐自由播放 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https…...

如何快速配置虚拟显示器:面向初学者的完整指南

如何快速配置虚拟显示器:面向初学者的完整指南 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 你是否在为游戏串流画质不佳而烦恼?或者需要为无显示器主机…...

ncmdumpGUI终极指南:3分钟搞定网易云音乐NCM文件转换

ncmdumpGUI终极指南:3分钟搞定网易云音乐NCM文件转换 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐的NCM加密格式而烦恼吗&…...

当卫星在天上“读懂”人间:ICLR 2025 论文深度解读师玉娇、昃向辉的CS2S

把一张卫星图变成一张街景照片,就像把一个俯视棋盘拼成一面看台——不仅要摆对每一枚棋子,还要看懂整场比赛想象这样一个场景:你在城市规划部门工作,需要快速生成某条街道在不同季节、不同天气条件下的真实渲染效果,以…...

告别硬编码!在UE5 GAS中实现动态技能键位绑定:从DataAsset配置到运行时热更新的完整流程

告别硬编码!在UE5 GAS中实现动态技能键位绑定:从DataAsset配置到运行时热更新的完整流程在当代RPG游戏开发中,技能系统的灵活性和可配置性往往决定了项目的迭代效率。传统硬编码的键位绑定方式不仅增加了程序与策划的沟通成本,更在…...

忆阻储层计算:预处理优化与硬件实现

1. 项目概述在当今人工智能快速发展的时代,神经形态计算正成为突破传统冯诺依曼架构瓶颈的重要方向。储层计算(Reservoir Computing,RC)作为一种特殊的循环神经网络架构,因其仅需训练输出层而显著降低了计算开销&#…...

无声输入革命:如何用Chaplin在5分钟内构建本地唇语识别系统

无声输入革命:如何用Chaplin在5分钟内构建本地唇语识别系统 【免费下载链接】chaplin A real-time silent speech recognition tool. 项目地址: https://gitcode.com/gh_mirrors/chapl/chaplin 在嘈杂的办公室、安静的图书馆,或是需要绝对隐私的医…...

对比直接调用厂商API使用Taotoken聚合调用的延迟体感差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接调用厂商API使用Taotoken聚合调用的延迟体感差异 在将应用从直接调用单一厂商的模型API迁移到Taotoken平台后,…...

基于Shapley值与随机森林的印度CPI通胀预测与特征重要性分析

1. 项目概述与核心价值在宏观经济预测领域,通胀预测的准确性直接关系到货币政策制定、市场预期管理乃至社会民生稳定。传统的计量经济学模型,如基于菲利普斯曲线的线性回归,虽然具有良好的可解释性,但在捕捉现实世界中复杂、非线性…...