有两个数组。有必要获得第一个和第二个数组的元素之间的最小差异。例如 [1, 4, 8, 12] 和 [5, 6, 13, 19]。答案应该是1,4和5的区别。我知道你需要合并数组,取数组中两个元素之间的最小差异,但是如何合并才能让你明白这个数字来自哪个数组呢?
有两个数组。有必要获得第一个和第二个数组的元素之间的最小差异。例如 [1, 4, 8, 12] 和 [5, 6, 13, 19]。答案应该是1,4和5的区别。我知道你需要合并数组,取数组中两个元素之间的最小差异,但是如何合并才能让你明白这个数字来自哪个数组呢?
我给你这个代码。它可能没有生产力。算法:搜索“直截了当”。当然,可以注意您在问题中指出了排序数组这一事实,并且由于在方法内部的第一个嵌套循环中
break;(带有附加条件)而简化了算法,但我很懒:) 我给出的程序(请注意:在 Java 中!)显示了在两个数组的哪些元素之间找到了最小的差异(模),并显示了差异本身。for()jfind()Actors:
print(int[] a, int i)-- 很好地打印数组,勾选第i-th 个元素delta(int a, int b)= |ab|find(int[] a1, int[] a2)-- 主要演员,实际执行最小差异的搜索,为我们显示整齐的数组,并指出形成最小差异的元素;此方法还显示增量本身。由于您需要获得每个数组元素之间的最小差异,您可以这样做:
UPD: 当然,前面的代码在性能方面根本不是最优的。稍微改善一下情况,如果不需要保存所有的差值,可以去掉输出数组的形成,立即计算最小值
我笨拙的解决方案,谢谢大家的回答
这取决于算法应该处理多少数据和多快,如果体积不大,那么您可以使用具有二次复杂度的最简单算法 - 在双循环中将第一个数组的每个元素与每秒进行比较并保持最小值区别。
但是,如果您需要一种快速算法,那么我建议您使用这个算法 - 首先我们按升序对两个数组进行排序,然后我们执行与归并排序相同的操作,即 我们比较数组的合并边界并保存一对元素内的最小差异,而我们不需要生成的合并数组。该算法的复杂度是 O(N*log(N)) 用于排序加上 O(N) 用于合并。
因为 我不太懂JavaScript,最后一个算法我写了C++代码,不难理解,可以适配JavaScript,也可以在线运行算法:
在这里我学习了一点 JavaScript,并为第一个具有二次复杂度的算法编写了另一个解决方案,您可以在线运行它:
这是另一个用 JavaScript 快速重写的 C++ 算法,在线运行: