平面上有 n 个点,如何求出任意两点的曼哈顿距离的最大值?

曼哈顿距离的公式为:

\[d((x_1, y_1), (x_2, y_2)) = |x_1 - x_2| + |y_1 - y_2|
\]

为了最大化曼哈顿距离,可以考虑绝对值展开的所有情况,我们可以考虑以下四个表达式:

对于点 $ (x_i, y_i) ) 和 ( (x_j, y_j) $,曼哈顿距离 $ |x_i - x_j| + |y_i - y_j| $ 可以转化为以下四种形式之一:

  1. $ (x_i + y_i) - (x_j + y_j) $
  2. $ (x_i - y_i) - (x_j - y_j) $
  3. $ -(x_i + y_i) + (x_j + y_j) $
  4. $ -(x_i - y_i) + (x_j - y_j) $

那么我们只需要跟踪这两个表达式的最大值和最小值:

  1. $ f_1(x, y) = x + y $
  2. $ f_2(x, y) = x - y $

对于每个表达式,我们可以找到其最大值和最小值,然后计算这些最大值和最小值之间的差值。

  1. 初始化四组变量,用来记录上述四个表达式的最大值和最小值:

    • $ \text{max1} = \text{min1} = x_1 + y_1 $
    • $ \text{max2} = \text{min2} = x_1 - y_1 $
  2. 遍历所有点 \((x_i, y_i)\),更新这四个值

  3. 计算两组差值的最大值:

    • $ d1 = \text{max1} - \text{min1} $
    • $ d2 = \text{max2} - \text{min2} $

    两个值实际上代表了所有四种绝对值展开的情况,几何上即线段从左下到右上和从左上到右下的两种情况。

  4. 曼哈顿距离的最大值就是最大值:

    \[\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 个点之间的最大曼哈顿距离的更多相关文章

  1. Python编程学习,高效求解素数程序实例

    素数是编程中经常需要用到的. 作为学习Python的示例,下面是一个高效求解一个范围内的素数的程序,不需要使用除法或者求模运算. #coding:utf-8 #设置python文件的编码为utf-8, ...

  2. 获取经纬度之间两点间真实距离(适用于GoogleMap,BaiduMap,Amap等)

    如何获取经纬度之间两点间真实距离(适用于GoogleMap,BaiduMap,Amap等)  目标:使用百度定位sdk开发实时移动距离计算功能,根据经纬度的定位,计算行驶公里数并实时刷新界面显示.大家 ...

  3. poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)

    /* poj 2187 Beauty Contest 凸包:寻找每两点之间距离的最大值 这个最大值一定是在凸包的边缘上的! 求凸包的算法: Andrew算法! */ #include<iostr ...

  4. 在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。为什么不用曼哈顿距离?

    曼哈顿距离只计算水平或垂直距离,有维度的限制.另一方面,欧氏距离可用于任何空间的距离计算问题. 因为,数据点可以存在于任何空间,欧氏距离是更可行的选择.例如:想象一下国际象棋棋盘,象或车所 做的移动是 ...

  5. poj 1985 Cow Marathon 树的直径

    题目链接:http://poj.org/problem?id=1985 After hearing about the epidemic of obesity in the USA, Farmer J ...

  6. 2021.07.09 K-D树

    2021.07.09 K-D树 前置知识 1.二叉搜索树 2.总是很长的替罪羊树 K-D树 建树 K-D树具有二叉搜索树的形态,对于每一个分类标准,小于标准的节点在父节点左边,大于标准的节点在父节点右 ...

  7. 欧几里德&扩展以及求解线性方程学习总结--附上poj1061解题报告

    欧几里德算法: 欧几里德就是辗转相除法,调用这个gcd(a,b)这个函数求解a,b的最大公约数 公式: gcd(a,b)=gcd(b,a%b):并且gcd(a,b)=gcd(b,a)=gcd(-a,b ...

  8. python爬虫 | 一条高效的学习路径

    数据是创造和决策的原材料,高质量的数据都价值不菲.而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如: 豆瓣.知乎:爬取优质答案,筛选出各话题下热门内容,探索用户的舆论导向. 淘宝 ...

  9. Edit Distance问题在两种编程范式下的求解

    本文已授权 [Coding博客](https://blog.coding.net) 转载 前言 Edit Distance,中文叫做编辑距离,在文本处理等领域是一个重要的问题,以下是摘自于百度百科的定 ...

  10. 概率分布之间的距离度量以及python实现

    1. 欧氏距离(Euclidean Distance)       欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式.(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧 ...

随机推荐

  1. [学习笔记] 斜率优化DP - DP

    这个真的好容易啊 --wzw 斜率优化dP 例题 [SDOI2012] 任务安排 毒瘤题,让我惨淡经营了两天.这道题luogu有简单版,可以先去看简单版. 显然这是一只DP题,直接开始推狮子.令 dp ...

  2. 20-canvas之形变

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  3. 网卡DM9000裸机驱动详解

    一.网卡 1. 概念 网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件.由于其拥有MAC地址,因此属于OSI模型的第2层.它使得用户可以通过电缆或无线相互连接. 每一个网卡都有一个被称 ...

  4. 简单理解.net 依赖注入的三种方式

    前言 :.NET5.0 于2020年11月10日正式发布,它是3.1之后的 .NET Core 的下一个主要版本.微软将这个新版本命名为 .NET 5.0 而不是 .NET Core 4.0,其原因有 ...

  5. C# 导出datatable数据到excel

    第一步:下载两个需要的NUGET包 1.org.in2bits.MyXls:2.NPOI 第二步:关键类OutExcel. using System; using System.Linq; using ...

  6. 深度解析HarmonyOS SDK实况窗服务源码,Get不同场景下的多种模板

    HarmonyOS SDK实况窗服务(Live View Kit)作为一个实时呈现应用服务信息变化的小窗口,遍布于设备的各个使用界面,它的魅力在于将复杂的应用场景信息简洁提炼并实时刷新,在不影响当前其 ...

  7. pc 移动端 双端切换-路由判断

    该封装主要以分类形式,实现对路由的简易区分.便于项目管理. 创建好项目,勾选路由插件,会自动生成 router文件夹与index.ts . index.ts 初始内容 创建项目 自动生成的router ...

  8. 使用Golang的协程竟然变慢了|100万个协程的归并排序耗时分析

    前言 这篇文章将用三个版本的归并排序,为大家分析使用协程排序的时间开销(被排序的切片长度由128到1000w) 本期demo地址:https://github.com/BaiZe1998/go-lea ...

  9. OpenTelemetry 实战:gRPC 监控的实现原理

    前言 最近在给 opentelemetry-java-instrumentation 提交了一个 PR,是关于给 gRPC 新增四个 metrics: rpc.client.request.size: ...

  10. vim命令之多行注释

    vim常用命令之多行注释和多行删除 vim中多行注释和多行删除命令,这些命令也是经常用到的一些小技巧,可以大大提高工作效率. 1.多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl + v, ...