高效求解 n 个点之间的最大曼哈顿距离
平面上有 n 个点,如何求出任意两点的曼哈顿距离的最大值?
曼哈顿距离的公式为:
\]
为了最大化曼哈顿距离,可以考虑绝对值展开的所有情况,我们可以考虑以下四个表达式:
对于点 $ (x_i, y_i) ) 和 ( (x_j, y_j) $,曼哈顿距离 $ |x_i - x_j| + |y_i - y_j| $ 可以转化为以下四种形式之一:
- $ (x_i + y_i) - (x_j + y_j) $
- $ (x_i - y_i) - (x_j - y_j) $
- $ -(x_i + y_i) + (x_j + y_j) $
- $ -(x_i - y_i) + (x_j - y_j) $
那么我们只需要跟踪这两个表达式的最大值和最小值:
- $ f_1(x, y) = x + y $
- $ f_2(x, y) = x - y $
对于每个表达式,我们可以找到其最大值和最小值,然后计算这些最大值和最小值之间的差值。
初始化四组变量,用来记录上述四个表达式的最大值和最小值:
- $ \text{max1} = \text{min1} = x_1 + y_1 $
- $ \text{max2} = \text{min2} = x_1 - y_1 $
遍历所有点 \((x_i, y_i)\),更新这四个值
计算两组差值的最大值:
- $ d1 = \text{max1} - \text{min1} $
- $ d2 = \text{max2} - \text{min2} $
两个值实际上代表了所有四种绝对值展开的情况,几何上即线段从左下到右上和从左上到右下的两种情况。
曼哈顿距离的最大值就是最大值:
\[\text{max_distance} = \max(d1, d2)
\]
这个算法的时间复杂度为 $ O(n) $,因为只需遍历所有点一次即可完成所有更新和计算。
int maxManhattanDistance(const vector<pair<int, int>>& points) {
int max1 = INT_MIN/2, min1 = INT_MAX/2;
int max2 = INT_MIN/2, min2 = INT_MAX/2;
for (const auto& point : points) {
int x = point.first;
int y = point.second;
// 更新 max1 和 min1
int f1 = x + y;
max1 = max(max1, f1);
min1 = min(min1, f1);
// 更新 max2 和 min2
int f2 = x - y;
max2 = max(max2, f2);
min2 = min(min2, f2);
}
int d1 = max1 - min1;
int d2 = max2 - min2;
return max(d1, d2);
}
int main() {
// 示例输入
vector<pair<int, int>> points = {{1, 2}, {3, 4}, {6, 1}, {-1, -3}};
int maxDistance = maxManhattanDistance(points);
cout << "Maximum Manhattan Distance: " << maxDistance << endl;
return 0;
}
高效求解 n 个点之间的最大曼哈顿距离的更多相关文章
- Python编程学习,高效求解素数程序实例
素数是编程中经常需要用到的. 作为学习Python的示例,下面是一个高效求解一个范围内的素数的程序,不需要使用除法或者求模运算. #coding:utf-8 #设置python文件的编码为utf-8, ...
- 获取经纬度之间两点间真实距离(适用于GoogleMap,BaiduMap,Amap等)
如何获取经纬度之间两点间真实距离(适用于GoogleMap,BaiduMap,Amap等) 目标:使用百度定位sdk开发实时移动距离计算功能,根据经纬度的定位,计算行驶公里数并实时刷新界面显示.大家 ...
- poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)
/* poj 2187 Beauty Contest 凸包:寻找每两点之间距离的最大值 这个最大值一定是在凸包的边缘上的! 求凸包的算法: Andrew算法! */ #include<iostr ...
- 在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?
曼哈顿距离只计算水平或垂直距离,有维度的限制.另一方面,欧氏距离可用于任何空间的距离计算问题. 因为,数据点可以存在于任何空间,欧氏距离是更可行的选择.例如:想象一下国际象棋棋盘,象或车所 做的移动是 ...
- poj 1985 Cow Marathon 树的直径
题目链接:http://poj.org/problem?id=1985 After hearing about the epidemic of obesity in the USA, Farmer J ...
- 2021.07.09 K-D树
2021.07.09 K-D树 前置知识 1.二叉搜索树 2.总是很长的替罪羊树 K-D树 建树 K-D树具有二叉搜索树的形态,对于每一个分类标准,小于标准的节点在父节点左边,大于标准的节点在父节点右 ...
- 欧几里德&扩展以及求解线性方程学习总结--附上poj1061解题报告
欧几里德算法: 欧几里德就是辗转相除法,调用这个gcd(a,b)这个函数求解a,b的最大公约数 公式: gcd(a,b)=gcd(b,a%b):并且gcd(a,b)=gcd(b,a)=gcd(-a,b ...
- python爬虫 | 一条高效的学习路径
数据是创造和决策的原材料,高质量的数据都价值不菲.而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣.知乎:爬取优质答案,筛选出各话题下热门内容,探索用户的舆论导向. 淘宝 ...
- Edit Distance问题在两种编程范式下的求解
本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...
- 概率分布之间的距离度量以及python实现
1. 欧氏距离(Euclidean Distance) 欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式.(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧 ...
随机推荐
- 纪念IE浏览器退役,哈哈哈!!!
网址: https://haokan.baidu.com/v?pd=wisenatural&vid=16024148879625055169 ========================= ...
- win+jenkins+git+allure+tomcat+jdk部署(万人坑)
万人坑:之所以叫万人坑,是一些网站真的是非常非常非常坑,且不说按照他们的方法一次都没成功,还遇到了各种千奇百怪的问题,浪费了本人3.1415926h的时间,真想给他们竖起一个超大号的倒拇指.下面开始踩 ...
- TGI 多-LoRA: 部署一次,搞定 30 个模型的推理服务
你是否已厌倦管理多个 AI 模型所带来的复杂性和高成本? 那么, 如果你可以部署一次就搞定 30 个模型推理服务会如何? 在当今的 ML 世界中,哪些希望充分发挥其数据的价值的组织可能最终会进入一个& ...
- 跨越时空的对话:如何使用AI阅读工具ChatDOC快速建立数字化身?
跨越时空的对话:如何使用 ChatDOC 快速建立数字化身?以史蒂夫·乔布斯 AI 为例 开门见山,这篇文章主要介绍如何将 AI 改造为靠谱.好用.基于某个人物的数字化身.比如,乔布斯 AI.马斯克 ...
- centos7安装docker详细教程
一.准备工作 1.系统要求 docker要求centos的内核版本不低于3.10.centos7满足最低内核要求. 检查当前的内核版本 [root@zspc /]# uname -r 3.10.0-1 ...
- SMU Summer 2024 Contest Round 4
SMU Summer 2024 Contest Round 4 Made Up 题意 给你三个序列 \(A,B,C\) ,问你满足 \(A_i = B_{C_j}\) 的 \((i,j)\) 对有多少 ...
- div构建table
1.Css display值与解释-(详细可见CSS手册的CSS display手册)参数:block :块对象的默认值.用该值为对象之后添加新行none :隐藏对象.与visibility属性的hi ...
- 【Linux】之切换root用户与重启系统相关命令
一.切换用户 <Linux中怎么从root用户切换到普通用户> su是在用户间切换,可以是从普通用户切换到root用户, test@ubuntu:~$ su Password: root@ ...
- [Udemy] AWS Certified Data Analytics Specialty - 3.Processing
Lambda Lambda 经常起胶水的作用,就是粘合不同的service. 如下图例子 另外Requirement #1 也是一个例子,还有Requirement #3 除了Kinesis Data ...
- jstack排查cpu占用高的步骤
通过jstack排查cpu占用高的问题 1.通过top命令找到cpu占用高的应用程序进程 2.通过top -H -p pid查看该应用中占用CPU高的线程. 3.通过printf "%x\n ...