找到距离最近的三个点
问题:
给定三个数组A,B,C,从这三个数组中分别取一个元素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,计算2(max-min),之后将最小元素对应的指针前移一位,重复以上过程,保留2(max-min)的最小值即可。

浙公网安备 33010602011771号