这里的问题是找到所有整数点的集合,它给出了来自给定点集的所有曼哈顿距离的最小总和!
例如:
让我们得到一组给定的点{P1,P2,P3 ...... Pn}
基本问题是找到一个点,说X在点{P1,P2,P3 ... Pn}的所有距离上都有最小总和。
即。 | P1-X | + | P2-X | + .... + | Pn-X | = D,其中D对所有X都是最小的。
更进一步,可以有多个X值满足上述条件。即,可能有多个X可以给出相同的值D.因此,我们需要找到所有这样的X.
任何人都能想到的一个基本方法是找到输入的中位数,然后强调this post中提到的坐标
但是这种方法的问题是:如果中位数给出了两个非常分开的值,那么我们最终会强制所有在给定时间内永远不会运行的点。
那么,是否有任何其他方法可以在结果相距很远时给出结果(中位数给出的范围大约为10 ^ 9)。
答案 0 :(得分:9)
您可以单独考虑X和Y,因为它们相互独立地增加了距离。这减少了在线上n个点找到与其他点之间的最小距离和的点的问题。这很简单:两个中位数(包括两个)之间的任何点都将满足这一点。
证明:如果我们的积分数相等,则会有两个中位数。两个中位数之间的点将在左侧有n / 2个点,在右侧有n / 2个点,并且到S的那些点的总距离之和。
如果我们将它向左移动一个点,S将向上移动n / 2 (因为我们从最右边的点移开)并向下移动n / 2 (因为我们正朝着最左边的点移动),所以整体S保持不变。在我们达到最左边的中间点之前,这是正确的。当我们向左移动最左边的中间点时,我们现在有(n / 2 + 1)点到右边,而(n / 2 - 1)指向左边,所以S上升了两个。继续向左只会进一步增加S. 按照同样的逻辑,最右边中间点右边的所有点也都有较高的S值。
如果我们有一个奇数点,那么只有一个中位数。使用与上面相同的逻辑,我们可以证明它具有最低的S值。
答案 1 :(得分:3)
如果中位数给出的间隔为10 ^ 9,那么该区间中的每个点都与其他任何点一样好。
因此,根据您稍后要对这些点做什么,您可以返回范围或枚举该范围内的点。没办法..
显然,在二维方面,你会得到一个三维的方形长方形等方法。
结果将始终是为每个维度获取的范围的笛卡尔积,因此您可以返回这些范围的列表。
答案 2 :(得分:1)
由于在曼哈顿距离内每个组件单独提供,您也可以单独考虑它们。最佳答案是(中位数(x),中位数(y))。你需要环顾这一点来寻找整数解。
注意:我在回答时没有正确阅读您的问题。我的回答仍然存在,但可能你已经知道了这个解决方案。
答案 3 :(得分:0)
是的我还认为,对于网格上的奇数N个点,将只有一个单点(即MEDIAN),它将与所有其他点的曼哈顿距离的最小总和。
对于N的偶数值,场景会有所不同。
根据我的说法,如果他们的笛卡尔乘积为X = {1,2} and Y= {3,4}
,那么它们总是为4。
即X × Y = {1,2} × {3,4} = {(1,3), (1,4), (2,3), (2,4)}
。这是我到目前为止所理解的。
对于偶数值,我们总是将“MIDDLE TWO”值作为MEDIAN。从X取2,从Y取2,将总是返回4点的笛卡尔乘积。
如果我错了,请纠正我。