最近对问题

  1. 问题
    最近对问题
    [描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)]
  2. 解析

[问题的理解和推导,可用电子版直接在此编写,也可用纸笔推导,拍照嵌入本文档]
3. 设计
2: 分治法。

与合并(归并)排序类似。
分解: 先把所有点按x 升序排序。 再取mid = (l+r) /2;

解决: 左右(返回d1,d2)两边分别递归下去,直到 1 或 2 可以直接返回值。 我们 取 mi = min(d1,d2);
表示当前最小的距离。

合并: 对于分开的两个区间,可能会存在着最短距离的两个点分别在分开的左右两边。所以我们要特殊处理这种情况。
我们按当前 l - r 的区间里面的点 按 y 升序排序(在这里我们可以运用归并排序的一部分进行合并)。以我们划分的点的x为中心线,把这个区间里面的点x轴距离中线小于m的加入到S里面。

接下来枚举每一个点,再枚举其它的任意一个点。算出距离(第二层循环证明它是小于等于6的)

证明如下,假设当前我们得到了这样一个区间,且当前处理的是这个点,则我们可以把它当作圆心,画出半径为d的圆,同时右边也可以画出一个矩形分成6个小矩形,这6个小矩形每个里面最多只会出现一个点(考虑两个点在一个小矩形的对角线处,长度也为5/6d,不会满足我们递归返回的最小值d),因为是按y从小到大排序,只会处理当前圆心点上方的点,下面画出极端情况后,一边就会有3个点需要遍历,左边也一样,所以左右边遍历点数最大为6。
[核心伪代码]
4. 分析
复杂度为O(nlogn)
[算法复杂度推导]
5. 源码
https://github.com/1796380574/-/blob/main/5
[github源码地址]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值