找到彼此之间的距离是一个数的倍数的点的子集

Find subset of points whose distance among each other is a multiple of a number

问题:给定一个数组 A 表示一条线上的点,例如[5,-4,1,3,6] 和一个数字 M=3,找到 A 内点的最大子集,它们之间的距离是 M 的倍数。

在示例中,两个可能的子集是 [-4,5](距离 9)和 [3,6](距离 3)。

显而易见的蛮力解决方案是在 O(N^2) 时间内计算每对点之间的距离,然后通过逐步构建子集来构建一组候选者。

有没有更高效的解决方案?

遍历数组中的数字并计算每个数字的 modulus M,然后按结果分组。最大的组就是最大的子集。

例如[5,-4,1,3,6] 会给出 [2,2,1,0,0]

您必须注意如何处理负数,负数的 modulus 运算被定义为 differently in some languages(例如 PHP),但您希望mod(-4, 3) 评估为 2,而不是 -1。对于底片,您可以将其计算为 (M - (-x mod M)) mod M

您可以通过存储包含数字的列表的哈希映射来有效地对数字进行分组,以 modulus 为键。