我最近在接受采访时被问到这个问题:
每个都有两个大小为'n'的数组。一个阵列有螺母,另一个有螺栓。每个螺母恰好适合一个螺栓,反之亦然。当您将螺母与螺栓进行比较时,您会得到3个结果中的一个:紧,松,合适。
如何有效地找到唯一的映射?
任何一套都无法进行排序。你永远不知道b1是否小于b2或
n1小于n2。其中n1,n2是螺母,b1,b2是螺栓。你唯一能做的就是将螺母与螺栓进行比较并得到一个结果:紧,适合,松散。
答案 0 :(得分:13)
类似快速排序的算法完成了这项工作:
n
并将其用作枢轴,将一组螺栓B
分成三组:紧(B1
),松散(B2
),适合。b
。现在,您将此螺栓用作枢轴,将螺母组N\n
分为两组:紧(N1
)或松散(N2
)。N1
和B1
,n
和b
,N2
和B2
。所有这些都是相同的大小。您可以在(N1,B2
)和(N2,B1
)上递归执行相同的分区,您可以得到最终答案。很明显,复杂度为O(N log N)
,与快速排序相同。
答案 1 :(得分:4)
取一个螺母N0
并将其与所有螺栓进行比较。根据结果信息,我们可以将bolt数组拆分为[bolts smaller than B0] + B0 + [bolts larger than B0]
。根据问题陈述,始终有一个符合B0
的唯一N0
。
然后选择下一个坚果N1
并将其与B0
进行比较。如果结果是“紧”,我们会像上面N0
那样搜索较小的一半。否则,我们会做同样的事情但是更大的一半。这样做会进一步将两半中的一半分成2个。
继续这样做,直到你完成了所有坚果。这相当于quicksort。平均情况是O(N logN),但是当列表已经“排序”时,O(N ^ 2)的明显最坏情况复杂性。
答案 2 :(得分:4)