我有一个我似乎无法弄清楚的面试问题.给定大小为N的阵列,找到大小为k的子集,使得子集中的元素彼此相距最远.换句话说,最大化元素之间的最小成对距离.
Example:
Array = [1,2,6,10]
k = 3
answer = [1,6,10]
Run Code Online (Sandbox Code Playgroud)
强力方式需要找到大小为k的所有子集,这些子集在运行时是指数的.
我的一个想法是从数组中均匀分布值.我的意思是
这是基于元素应尽可能均匀分布的直觉.我不知道如何证明它有效/无效.如果有人知道如何或有更好的算法,请分享.谢谢!
这可以使用DP在多项式时间内求解.
如上所述,第一步是对列表A进行排序.让X [i,j]成为从第一个i元素A中选择j个元素的解决方案.
现在,在k <= i时,X [i + 1,j + 1] = max(min(X [k,j],A [i + 1] -A [k])).
我将离开初始化步骤并记住子集步骤供您使用.
在您的示例(1,2,6,10)中,它按以下方式工作:
1 2 6 10
1 - - - -
2 - 1 5 9
3 - - 1 4
4 - - - 1
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2954 次 |
最近记录: |