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

Leetcode 3464. Maximize the Distance Between Points on a Square

  • Leetcode 3464. Maximize the Distance Between Points on a Square
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3464. Maximize the Distance Between Points on a Square

1. 解题思路

说来惭愧,这道题我也没有自力搞定,也是问了一下DeepSeek R1之后搞明白的解法,感觉真的被LLM完爆了……

不过,也不知道是不是错觉,总觉得DeepSeek发布之后,Leetcode每周hard的题目都变得难了好多,以前基本都能搞定,最近感觉卡壳的几率好高……

这道题核心思路还是二分法求临界值,因此我们事实上要做的就是在已知目标距离 d d d的情况下判断能否从给定的 n n n个点当中找出 k k k个点,使得其两两的曼哈顿距离的最小值均不小于 d d d

然后我就卡在这里了,完全没啥好的思路,但是DeepSeek R1搞定了。

它的思路的话其实还是挺简单的,就是先将所有的点的坐标改写为一个标量值然后进行排列,并确保任意两个点之间的曼哈顿距离就是这两个标量的差,由此,我们即可以通过二分法快速地查找得到当一个点被取用是其下一个可取用的点,且保证该取法下任意两个点之间的距离均不小于 d d d

但这里的问题就在于说如何进行这个排序的过程,DeepSeek给出的方法是使用周长的方式,即从坐标点 ( 0 , 0 ) (0,0) (0,0)开始顺时针延正方形绕一圈,任意点的坐标就是其到原点 ( 0 , 0 ) (0, 0) (0,0)的距离。

需要注意的是,在这种情况下,上述描述,即任意两点的曼哈顿距离就是其坐标的差这个表述事实上并不总是满足,当两个点分别位于平行的两条对边上时是不成立的,但是因为 k ≥ 4 k \geq 4 k4,因此事实上我们的距离上限总是小于等于边长 s s s的,因此我们事实上只需要保证临边上的两点的距离计算正确即可,而这是可以保证的。

另外还要注意的是,考察靠后的点作为第一个取用的点时,我们需要回过头来考察头部点,因此我们需要绕两圈来成环,且需要保证我们最终取出来的 k k k个点的跨度在 4 s − d 4s-d 4sd范围内,不然最后两个点的距离同样会小于 d d d

2. 代码实现

给出最终的python代码实现如下:

class Solution:
    def maxDistance(self, side: int, points: List[List[int]], k: int) -> int:
            # 转换每个点到周长坐标
            sorted_p = []
            for x, y in points:
                if x == 0:
                    coord = y
                elif y == side:
                    coord = side + x
                elif x == side:
                    coord = 3 * side - y
                else:  # y == 0
                    coord = 3 * side + (side - x)
                sorted_p.append(coord)
            sorted_p.sort()
            n = len(sorted_p)

            def is_possible(d):
                if d == 0:
                    return True
                # 扩展数组以处理环形问题
                extended_p = sorted_p + [p + 4 * side for p in sorted_p]
                # 遍历每个可能的起点
                for i in range(n):
                    current = i
                    count = 1
                    for _ in range(k - 1):
                        target = extended_p[current] + d
                        # 查找下一个点的位置
                        j = bisect.bisect_left(extended_p, target, current + 1)
                        if j >= len(extended_p):
                            break
                        current = j
                        count += 1
                    if count >= k:
                        # 计算跨度
                        span = extended_p[current] - extended_p[i]
                        if span <= 4 * side - d:
                            return True
                return False

            # 二分查找
            low = 0
            high = side + 1
            ans = 0
            while low < high-1:
                mid = (low + high) // 2
                if is_possible(mid):
                    low = mid
                else:
                    high = mid
            return low

提交代码评测得到:耗时739ms,占用内存23.4MB。

相关文章:

  • vue3中解决组件间 css 层级问题最佳实践(Teleport的使用)
  • 计算机网络真题练习(高软29)
  • 会话对象 Cookie 四、Cookie的路径
  • 【PostgreSQL】如何通过调整PostgreSQL配置参数提高数据库性能
  • Git Repo下如何制作一个patch文件
  • Oracle:执行DELETE语句长时间无响应的排查步骤及解决方案
  • 超多目标优化:基于导航变量的多目标粒子群优化算法(NMOPSO)的无人机三维路径规划,MATLAB代码
  • 机器视觉--Halcon的数据结构(数组)
  • STM32单片机开发(6).离散PID公式:位置式PID 增量式PID
  • Unity 3D模型边缘锯齿严重
  • Android 技术栈
  • 跟着李沐老师学习深度学习(十四)
  • Visual Studio更新说明(关注:.NET+AI生产力)
  • 本地部署Qwen2.5-VL-7B-Instruct多模态视觉大模型(Windows篇)
  • docker部署安装Seata服务
  • 小波变换背景预测matlab和python样例
  • 从头再来!社招找工作——算法题复习九:动态规划
  • 在 Mac ARM 架构上使用官方安装包安装 MySQL
  • 大语言模型(LLM)微调技术笔记
  • PH热榜 | 2025-02-23
  • wordpress自动跳转相近链接/seo营销外包公司
  • 大连意动网站建设有限公司怎么样/seo网站推广与优化方案
  • 在线文字编辑器/南宁seo排名首页
  • 把自己做的网站开放到外网/外贸网络推广怎么做
  • 个人养老保险查询个人账户查询/百度网站优化
  • 政府网站模板免费下载/成都业务网络推广平台