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

LeetCode 3464. 正方形上的点之间的最大距离——二分答案 + 环上贪心(超详细图解 + 完整代码)

LeetCode 3464. 正方形上的点之间的最大距离——二分答案 + 环上贪心(超详细图解 + 完整代码)

一、题目概述

1.1 题目描述

给定一个边长为side的正方形,正方形四个顶点坐标固定为:\(0, 0\)\(side, 0\)\(side, side\)\(0, side\)。所有给定的点均落在正方形的四条边界上,且所有点坐标互不重复。

现在需要从所有边界点中挑选出k个点,满足核心条件:最大化所选点集中两两之间的最小曼哈顿距离。最终返回这个最大的最小曼哈顿距离。

两点曼哈顿距离公式:d=∣x1−x2∣+∣y1−y2∣d = |x_1 - x_2| + |y_1 - y_2|d=x1x2+y1y2

1.2 题目重难点分析

  • 题型归类:最大化最小值经典问题,算法模板优先考虑二分答案

  • 核心难点:点分布在正方形环形边界上,常规二维距离计算复杂,无法直接贪心

  • 关键限制k ≤ 25(数值极小),n ≤ 15000,可支持线性+小常数复杂度算法

  • 数据范围side ≤ 10^9,无法遍历模拟,必须用二分降维

1.3 示例解读

示例1

side=2,points=[[0,2],[2,0],[2,2],[0,0]],k=4输出:2

选取全部4个顶点,四个点均匀分布在正方形边界,两两最小曼哈顿距离为2,为最优解。

示例2

side=2,points=[[0,0],[1,2],[2,0],[2,2],[2,1]],k=4输出:1

最优选点:\(0, 0\)、\(2, 0\)、\(2, 2\)、\(2, 1\),点集中最小曼哈顿距离为1,无法找到更大的合法距离。

二、核心解题思路:问题转化

2.1 关键数学结论(解题核心)

对于正方形边界上的任意两点,其曼哈顿距离 = 两点沿正方形边界的最短弧长

基于该结论,我们可以将二维平面点问题,完全转化为一维环形区间选点问题,极大降低解题难度。

2.2 二维坐标转一维环坐标

我们规定:从起点\(0,0\)出发,顺时针沿正方形边界遍历,将边界上的每个点映射为一维坐标t,环形总周长L = 4 \* side,所有t的取值范围为\[0, L\)

四条边的映射规则:

  1. 底边(y=0):从左到右,t = x

  2. 右边(x=side):从下到上,t = side \+ y

  3. 顶边(y=side):从右到左,t = 3 \* side \- x

  4. 左边(x=0):从上到下,t = 4 \* side \- y

坐标映射工具函数(内嵌主代码):

# 二维边界坐标转一维环坐标t=[]forx,yinpoints:ify==0:# 底边t.append(x)elifx==side:# 右边t.append(side+y)elify==side:# 顶边t.append(3*side-x)else:# 左边 x == 0t.append(4*side-y)

2.3 问题最终转化

原问题等价于:在长度为L=4\*side的圆环上,有n个定点,选取k个点,使得所有点两两之间的最短环距的最小值最大

标准的二分答案 + 贪心校验模板题。

三、完整算法设计

3.1 二分答案框架

二分范围确定
  • 最小可能距离:1

  • 最大可能距离:2 \* side(正方形对角点最大曼哈顿距离,半环长)

二分逻辑:枚举距离mid,校验是否能选出k个点满足所有点间距 ≥mid。若可行,尝试更大距离;否则缩小距离。

3.2 核心:check(D) 可行性校验函数

功能:判断是否存在一种选点方案,使得选出的k个点,任意两点的环上最短距离 ≥D

步骤1:破环为链

环形问题最难处理首尾衔接问题,通过数组加倍破环为链:将所有一维坐标 + 周长L追加到原数组后,得到长度为2n的扩展数组,覆盖所有环形遍历场景。

ext=t+[x+Lforxint]
步骤2:双指针预处理下一可行点

预处理next\_pos数组,next\_pos\[i\]表示从ext\[i\]出发,第一个距离 ≥D的点的下标。双指针单次遍历即可完成预处理,时间复杂度O\(n\)

m=2*n next_pos=[m]*m j=0foriinrange(m):ifj<i:j=i# 找到第一个间距大于等于D的点whilej<mandext[j]-ext[i]<D:j+=1next_pos[i]=j
步骤3:贪心选点校验

枚举每一个原始点作为起点,每次贪心选择最近的合法下一个点(最优贪心策略,预留最大空间给后续选点),连续选取k\-1次。选完后额外校验首尾点环形间距是否合法。

首尾校验条件:ext\[cur\] \- ext\[i\] ≤ L \- D,保证环上另一侧间距也 ≥ D。

# 枚举所有原始起点foriinrange(n):cur=i# 贪心选取k-1个点for_inrange(k-1):cur=next_pos[cur]ifcur>=i+n:# 超出一圈范围,选点失败breakelse:# 首尾环形距离合法,满足条件ifext[cur]-ext[i]<=L-D:returnTruereturnFalse

四、完整可运行代码(带详细注释)

fromtypingimportListclassSolution:defmaxDistance(self,side:int,points:List[List[int]],k:int)->int:# 1. 将正方形二维边界点映射为一维环形坐标t=[]forx,yinpoints:ify==0:# 底边:(x,0)t.append(x)elifx==side:# 右边:(side,y)t.append(side+y)elify==side:# 顶边:(x,side)t.append(3*side-x)else:# 左边:(0,y)t.append(4*side-y)# 对一维坐标排序,保证环形有序t.sort()n=len(t)L=4*side# 正方形边界环形总周长# 2. 二分答案校验函数:判断距离D是否可行defcheck(D:int)->bool:# 破环为链,扩展数组处理环形首尾问题ext=t+[x+Lforxint]m=2*n next_pos=[m]*m j=0# 双指针预处理每个位置的下一个合法点foriinrange(m):ifj<i:j=iwhilej<mandext[j]-ext[i]<D:j+=1next_pos[i]=j# 枚举每一个原始点作为起点,贪心选k个点forstartinrange(n):cur_idx=start# 贪心选择后续k-1个点for_inrange(k-1):cur_idx=next_pos[cur_idx]# 超出环形一圈范围,选点失败ifcur_idx>=start+n:breakelse:# 成功选满k个点,校验首尾环形距离ifext[cur_idx]-ext[start]<=L-D:returnTruereturnFalse# 3. 二分查找最大合法最小距离left,right=1,2*side res=0whileleft<=right:mid=(left+right)//2ifcheck(mid):# 当前距离可行,尝试更大距离res=mid left=mid+1else:# 当前距离不可行,缩小范围right=mid-1returnres

五、复杂度详细分析

5.1 时间复杂度

  • 坐标映射+排序O(nlog⁡n)O(n \log n)O(nlogn),n 为点的数量

  • 二分次数O(log⁡(side))O(\log(side))O(log(side)),side 最大 1e9,二分最多32次

  • 单次check复杂度:双指针预处理O(n)O(n)O(n)+ 贪心枚举O(nk)O(nk)O(nk)

  • 总复杂度O(nlog⁡n+nklog⁡(side))O(n \log n + nk \log(side))O(nlogn+nklog(side))

数据极限下(n=15000,k=25)运算量仅千万级,完全满足题目时间限制。

5.2 空间复杂度

O(n)O(n)O(n),主要消耗为扩展数组ext和预处理数组next\_pos

六、算法正确性证明

6.1 贪心策略正确性

在固定起点、固定最小间距D的前提下,每次选择最近的合法下一个点是最优策略。原因:尽早选点可以让后续剩余区间更长,拥有更大的选点空间,是区间选点问题的经典最优贪心策略,不会出现漏解。

6.2 环形校验正确性

破环为链后,通过ext\[cur\] \- ext\[start\] ≤ L \- D可以严格保证:所选点集在环形上的首尾间距 ≥ D,彻底解决环形首尾衔接问题。

七、解题总结与模板提炼

7.1 本题核心技巧

  1. 维度降维:正方形边界曼哈顿距离 → 一维环形弧长,化繁为简

  2. 破环为链:数组加倍处理环形首尾特殊约束

  3. 二分答案:解决最大化最小值通用问题

  4. 双指针+贪心:高效校验可行性,适配题目数据范围

7.2 通用模板(最大化最小值环形选点)

适用于所有「环形选k个点,最大化最小间距」类题目:

  1. 坐标归一化/映射为一维环形坐标

  2. 二分枚举答案距离

  3. 破环为链,双指针预处理可行点

  4. 枚举起点贪心选点,校验合法性

http://www.jsqmd.com/news/700579/

相关文章:

  • NVIDIA Nemotron全栈技术解析:构建专业级AI代理系统
  • Python 协程任务异常处理机制
  • Arm SVE2指令集:矩阵运算与密码学加速实战解析
  • 项目管理系统选型如何判断是补齐短板还是替换全套工具
  • AI 12小时设计CPU完整解析:从219字到RISC-V内核的技术突破
  • 云原生入门系列|第14集:K8s进阶入门,从基础到生产的过渡技巧
  • 浏览器渲染原理进阶:重排重绘底层机制 + 实战检测 + 终极规避方案(DevTools高阶实战)
  • 【BECKHOFF】【SIEMENS】倍福C9900-M800按钮盒说明、资料、系统卡备份
  • AI大模型大师秘籍:2026年AI技术全景揭秘,从入门到精通
  • Windows虚拟显示器驱动解决方案:基于Rust与WDF/UMDF架构的高性能虚拟显示扩展
  • 分类数据集 - 道路状况检测图像分类数据集下载
  • PHPStudy V8.1 vs 2018版深度对比:选哪个更适合你的Web开发或安全学习?
  • 2026天津复读学校实测优选|提分高口碑稳,辅仁学校重点优先锁定 - 外贸老黄
  • 一体化项目管理工具有哪些?6款热门方案对比与分析
  • NVIDIA Nemotron如何优化RAG系统的查询重写技术
  • BarrageGrab:全平台直播弹幕抓取技术解决方案与实战指南
  • zmq源码分析之DEALER/ROUTER 路由机制的应用场景
  • 高通QCC730M与QCC74xM物联网模块技术解析与应用
  • Open XML SDK完全指南:高效处理Office文档的终极实战方案
  • 电磁夹爪工作特性是什么?提供高适配产品选购参考 - 品牌2026
  • JVM 内存模型 + G1、ZGC 设计原理、垃圾回收算法、生产调优(完整版・面试 + 落地)
  • 2026年北仑区电脑回收需求激增,为何推荐宁波圣航再生资源回收有限公司? - 2026年企业推荐榜
  • 任天堂Switch游戏串流革命:3步解锁PC 3A大作的终极指南
  • 2026届毕业生推荐的十大AI辅助论文网站实际效果
  • 逆向瑞数5时,那些容易被忽略的DOM与BOM检测点(含WebGL/电池API)
  • 企业级低代码调试安全红线(内部绝密文档流出):禁用eval调试、强制符号服务器校验、敏感数据自动脱敏——VSCode插件级强制策略部署实录
  • 2026格尔木烟酒服务top5测评:格尔木名酒哪家真,格尔木名酒回收,格尔木名酒销售,实力盘点! - 优质品牌商家
  • VSCode 2026量子语法高亮上线倒计时:微软QDK团队亲授3个未文档化API钩子,现在配置可提前解锁2027年特性预览通道
  • 2026年当下,如何甄选靠谱的静音舱直销厂家? - 2026年企业推荐榜
  • PAT乙级2024春B-1题解:用Python验证‘偶数个奇数’这个隐藏条件(附完整代码)