我必须在两个阵列中找到最接近的数字并显示它们的区别。我正在使用循环,但它需要太多时间。你知道如何让这个算法更快吗?
#include <cmath>
#include <cstdio>
using namespace std;
long long int red, yellow, minimum = 1000000000, difference = 0;
long long int TC[100001], ZT[100001];
int main()
{
scanf("%d", &red);
for (int y = 0; y < red; ++y)
{
scanf("%d", &TC[y]);
}
scanf("%d", &yellow);
for (int yy = 0; yy < yellow; ++yy)
{
scanf("%d", &ZT[yy]);
}
for (int yyy = 0; yyy < red; ++yyy)
{
for (int i = 0; i < yellow; ++i)
{
difference = abs(TC[yyy] - ZT[i]);
if (difference == 0)
{
minimum = 0;
break;
}
else if (difference < minimum)
minimum = difference;
}
}
printf("%d \n", minimum);
}
答案 0 :(得分:3)
这应该是O(log n):
sort two lists
let i = 0, j = 0, minval = abs(list1[0] - list2[0])
as long as both lists have more items:
minval = min(minval, abs(list1[i] - list2[j])
if abs(list1[i + 1] - list2[j]) < abs(list1[i] - list2[j + 1])
increment i
else increment j
答案 1 :(得分:1)
如果对它们进行排序,则可以优化算法以更快地运行。当您对两个数组进行排序时,您可以逐个检查并比较它们的当前算法。因为你会跳过它们中的一些,因为你知道它们已被分类。
顺便说一句,既然你从用户那里得到了数字,我建议你把数字排序。每次用户输入一个数字时,请将数字放在一个数字后面的数字大于它的数字和数字之前的数字小于它。要做这样的事情,也许使用链表是更好的主意(或更容易)。