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

LeetCode 3740. 三个相等元素之间的最小距离 I, 3741. 三个相等元素之间的最小距离 II【按照相同元素分组】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个整数数组nums

如果满足nums[i] == nums[j] == nums[k],且(i, j, k)是 3 个不同下标,那么三元组(i, j, k)被称为有效三元组

有效三元组距离被定义为abs(i - j) + abs(j - k) + abs(k - i),其中abs(x)表示x绝对值

返回一个整数,表示有效三元组最小可能距离。如果不存在有效三元组,返回-1

示例 1:

输入: nums=[1,2,1,1,3]输出:6

解释:最小距离对应的有效三元组是(0, 2, 3)

(0, 2, 3)是一个有效三元组,因为nums[0] == nums[2] == nums[3] == 1。它的距离为abs(0 - 2) + abs(2 - 3) + abs(3 - 0) = 2 + 1 + 3 = 6

示例 2:

输入: nums=[1,1,2,3,2,1,2]输出:8

解释:最小距离对应的有效三元组是(2, 4, 6)

(2, 4, 6)是一个有效三元组,因为nums[2] == nums[4] == nums[6] == 2。它的距离为abs(2 - 4) + abs(4 - 6) + abs(6 - 2) = 2 + 2 + 4 = 8

示例 3:

输入: nums=[1]输出:-1

解释:不存在有效三元组,因此答案为 -1。

提示:

  • 1 <= n == nums.length <= 10^5
  • 1 <= nums[i] <= n

解法 按照相同元素分组的O ( n ) O(n)O(n)做法

按照相同元素分组,记录相同元素的下标,保存到列表中。

i , j , k i,j,ki,j,k画在一维数轴上,∣ i − j ∣ + ∣ j − k ∣ + ∣ k − i ∣ ∣i−j∣+∣j−k∣+∣k−i∣ij+jk+ki的几何意义就是这三个下标中的最左最右下标之差的两倍,设最左最右的下标分别为i iik kk,那么三元组的距离为2 ( k − i ) 2(k−i)2(ki)

为了让2 ( k − i ) 2(k−i)2(ki)尽量小,可以取同一组中的连续三个下标分别作为i , j , k i,j,ki,j,k。计算上式的最小值,即为答案。

classSolution{publicintminimumDistance(int[]nums){Map<Integer,List<Integer>>pos=newHashMap<>();for(inti=0;i<nums.length;i++){pos.computeIfAbsent(nums[i],_->newArrayList<>()).add(i);}intans=Integer.MAX_VALUE;for(List<Integer>p:pos.values()){for(inti=2;i<p.size();i++){ans=Math.min(ans,(p.get(i)-p.get(i-2))*2);}}returnans==Integer.MAX_VALUE?-1:ans;}}
classSolution{public:intminimumDistance(vector<int>&nums){unordered_map<int,vector<int>>pos;for(inti=0;i<nums.size();i++){pos[nums[i]].push_back(i);}intans=INT_MAX;for(auto&[_,p]:pos){for(inti=2;i<p.size();i++){ans=min(ans,(p[i]-p[i-2])*2);}}returnans==INT_MAX?-1:ans;}};
classSolution:defminimumDistance(self,nums:List[int])->int:pos=defaultdict(list)fori,xinenumerate(nums):pos[x].append(i)ans=infforpinpos.values():foriinrange(2,len(p)):ans=min(ans,(p[i]-p[i-2])*2)return-1ifans==infelseans
funcminimumDistance(nums[]int)int{pos:=map[int][]int{}fori,x:=rangenums{pos[x]=append(pos[x],i)}ans:=math.MaxIntfor_,p:=rangepos{fori:=2;i<len(p);i++{ans=min(ans,(p[i]-p[i-2])*2)}}ifans==math.MaxInt{return-1}returnans}

小优化:如果n u m s numsnums包含3 33个连续相同的数,直接返回最小答案4 44

classSolution{publicintminimumDistance(int[]nums){Map<Integer,List<Integer>>pos=newHashMap<>();for(inti=0;i<nums.length;i++){if(i>=2&&nums[i]==nums[i-1]&&nums[i]==nums[i-2]){return4;}pos.computeIfAbsent(nums[i],_->newArrayList<>()).add(i);}intans=Integer.MAX_VALUE;for(List<Integer>p:pos.values()){for(inti=2;i<p.size();i++){ans=Math.min(ans,(p.get(i)-p.get(i-2))*2);}}returnans==Integer.MAX_VALUE?-1:ans;}}
classSolution{public:intminimumDistance(vector<int>&nums){unordered_map<int,vector<int>>pos;for(inti=0;i<nums.size();i++){if(i>=2&&nums[i]==nums[i-1]&&nums[i]==nums[i-2]){return4;}pos[nums[i]].push_back(i);}intans=INT_MAX;for(auto&[_,p]:pos){for(inti=2;i<p.size();i++){ans=min(ans,(p[i]-p[i-2])*2);}}returnans==INT_MAX?-1:ans;}};
classSolution:defminimumDistance(self,nums:List[int])->int:pos=defaultdict(list)fori,xinenumerate(nums):ifi>=2andx==nums[i-1]==nums[i-2]:return4pos[x].append(i)ans=infforpinpos.values():foriinrange(2,len(p)):ans=min(ans,(p[i]-p[i-2])*2)return-1ifans==infelseans
funcminimumDistance(nums[]int)int{pos:=map[int][]int{}fori,x:=rangenums{ifi>=2&&x==nums[i-1]&&x==nums[i-2]{return4}pos[x]=append(pos[x],i)}ans:=math.MaxIntfor_,p:=rangepos{fori:=2;i<len(p);i++{ans=min(ans,(p[i]-p[i-2])*2)}}ifans==math.MaxInt{return-1}returnans}

复杂度分析:

  • 时间复杂度:O ( n ) O(n)O(n),其中n nnn u m s numsnums的长度。
  • 空间复杂度:O ( n ) O(n)O(n)
http://www.jsqmd.com/news/615925/

相关文章:

  • 如何把PV数据录入从“人肉战场“变成了全自动流水线
  • 直播预告 | 别再从零写标准了!——AI帮你5分钟生成标准草案
  • CANopen 转 Modbus-RTU 网关应用场景?
  • 为什么你的GraalVM镜像启动快却OOM?揭秘元空间泄漏、反射注册冗余与堆外内存失控的3大隐性杀手
  • 安装对中不到位,丝杆升降机越用越费!5大严重后果必看
  • 频域+卷积神经网络:好发又实用的论文黄金组合!轻松冲CVPR
  • 如何通过WeChatMsg构建个人社交数据智能分析系统
  • OpenClaw自动化运维:Qwen3-14b_int4_awq实现服务器日志分析
  • 终极指南:简单三步解锁《原神》60帧限制,享受丝滑流畅体验
  • 企业级智能测试用例生成系统 · 五大核心亮点 · 面试必杀技
  • 从排序到生成:腾讯广告算法大赛 2025 baseline解读
  • android调试常用命令
  • AI写论文就选它们!4个AI论文写作工具,搞定期刊论文写作!
  • 电动采光天窗实践案例,亲测效果分享!
  • OpenClaw+gemma-3-12b-it自动化周报系统:从数据收集到PPT生成
  • 关于 vcredist 与 Qt 程序部署:你该知道的一切
  • AI 入门 30 天挑战 - Day 6 费曼学习法版 - 模型评估和优化
  • 2026年一站式GEO优化软件系统企业服务优势大揭秘,快来一探究竟!
  • 将盾CDN:网络空间测绘构建数字化时代的安全底图
  • 【Tailwind】侧边栏标题
  • 小组国内汽车销量分析 数据表清洗与处理部分
  • 2026年4月目前有名的分析仪厂商推荐分析,金属检测仪/合金分析仪/手持矿石元素分析仪,分析仪公司推荐分析 - 品牌推荐师
  • SVN更新提交等图标消失恢复
  • Python如何实现定时异步任务_结合asyncio与loop.call_later调用
  • OpenClaw错误处理大全:Qwen3.5-9B任务失败时的10种自修复方案
  • 2026年成都新郎西装定制品牌排行:商务装定制/四川西装定制/婚礼服装定制/定制方巾/定制衬衫/定制西装上衣/定制西裤/选择指南 - 优质品牌商家
  • 在JUNIPER MX960中查询流量的策略
  • 2026年4月互联网SoC芯片选型指南:多功能加密芯片、安全加密芯片、防复制芯片、防抄板芯片、互联网SoC芯片选择指南 - 优质品牌商家
  • 2026 安全生产精选:五款巡检软件实用清单,隐患排查与闭环管理轻松上手
  • 论文写作工具对比:从多工具切换到一站式工具的真实体验