我知道已经有类似的问题(1、2、3),但它们都是用 Python 编写的,不符合我的需要。
给定两个排序列表,比如 1, 6, 13, 21, 28
和 2, 15, 20
。返回第一个数组中最接近数字的索引,不重复(与上面的链接 1 不同),在本例中为 0, 2, 3
。
棘手的一点是,在 1, 4, 66, 67, 68, 71
和 68, 68, 68, 82, 82
的情况下,返回 2, 3, 4, 5, 1
比 1, 2, 3, 4, 5
更可取。
有可能第一个列表的长度<第二个列表的长度。 1, 7, 11
和 6, 24, 28, 32, 34
应该返回 0, 1, 2, X, X
,其中 X
可以是除 0、1 和 2 之外的任何整数。(0, 1, 2, -1, -1
和 0, 1, 2, 3, 4
可以接受。)
编辑:只需交换两个列表并返回 0, 1, 2
。
最好使用类 C 语言或伪代码给出的代码。
有什么比蛮力搜索更好的主意吗?
给定的示例可能不是最佳解决方案,例如最后的(删除线)示例可以返回 1, 0, 2
(1, 0, 2, X, X
)。
答案 0 :(得分:0)
让第一个数组为 a
,第二个为 b
。
让将索引 i
分配给 b[j]
的成本为 abs(a[i] - b[j])
。然后我们可以通过在 O(nr2) 时间内将问题建模为 unbalanced assignment problem 来找到解决方案,其中 r 是最小数组的大小,n 最大的。