找出距离最近的三个点

该博客探讨了一种算法,用于在一组点中找到距离最近的三个点。通过迭代比较和选择,可以有效地找到使最大距离减去最小距离之差最小的三个点。
摘要由CSDN通过智能技术生成
本文章来源于 http://www.jobcoding.com/
问题描述:
给定三个数组A,B,C,从这三个数组中分别取一个元素a,b,c,使得|a-b|+|b-c|+|c-a| 最小。

【方案一】

<直接枚举法>
该题最直接的方法是枚举,即枚举三个数组组成的所有三元组<a,b,c>,然后求出|a-b|+|b-c|+|c-a| 最小值。

【方案二】

<巧妙转化法>
一般而言,见到绝对值号,首先想到的应是去绝对值号。

枚举6种a,b,c之间的大小关系,如a>=b>=c,则|a-b|+|b-c|+|c-a| =2(a-c)。
可以得到结论:|a-b|+|b-c|+|c-a|只与a,b,c中最大值和最小值有关。这个很容易通过画数轴证明,
在数轴上,三个点两两距离之和记为最大值与最小值距离的两倍。

得到上面结论后,怎样高效的得到|a-b|+|b-c|+|c-a| 最小值呢?

想一下极端情况:将三个数组合并成一个数组,对该数组排序后,如果相邻三个数正好来自三个不同数组,
则|a-b|+|b-c|+|c-a| 最小值肯定可通过相邻三个数获得。这样,仅扫描一遍便可求出该最小值。

将该极端情况的算法扩展到一般情况的算法:先对三个数组进行排序,然后用三个指针分别指向三个数组起始位置,
获取三个指针指向的元素中最大值max和最小值min,计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值