我尝试了蛮力的方式:
#include <stdio.h>
int sum(int a [],int b[], int m);
int main (void)
{
int a [] = {1,2,3,4,5};
int b [] = {4,3,5,2,6};
int i;
printf("Enter to find a given number:\n");
scanf("%d",&i);
printf("%s\n",sum(a,b,i) ? "True":"False");
return 0;
}
int sum(int a[], int b[],int m)
{
int i=0,j=0;
for (i=0;i<=sizeof(a)/sizeof(int)+1;i++)
for(j=0;j<=sizeof(b)/sizeof(int)+1;j++)
if (a[i]+b[j]==m)
return 1;
return 0;
}
正如您所看到的,运行时间是O(n ^ 2),有没有巧妙的方法来最小化这个?
答案 0 :(得分:5)
更快的解决方案(O(n)
)是使用哈希表。只需将第一个数组中的所有元素放入其中,然后迭代第二个数组,检查目标数与当前数之间的差异是否在哈希表中。
这是C ++中的实现:
int main(){
int a [5] = {1,2,3,4,5};
int b [5] = {4,3,5,2,6};
int m;
printf("Enter to find a given number:\n");
scanf("%d",&m);
set<int> s;
for (int i = 0; i < 5; i++)
s.insert(a[i]);
for (int i = 0; i < 5; i++)
if (s.count(m-b[i]) > 0) {
printf("True\n");
return 0;
}
printf("False\n");
}
答案 1 :(得分:0)
简而言之,请使用哈希表。
答案 2 :(得分:0)
不需要哈希表!!
您可以对数组进行排序(一个增加另一个减少),然后比较数组的第一个元素。在每一步然后移动第一个数组增加,然后在第二个数字减少(如果总和太大,你应该移动减少的数组,如果总和太小,你必须移动增加的数组)
该算法为2N log(N)+ 2 N
答案 3 :(得分:0)
您可以预先计算“sums”数组,按大小顺序排列,然后bsearch(3)数组:
int sums = { /* list of sorted sums */ };
int compare(void *a, void *b) { return ((int *)a - (int *)b); }
if (bsearch((void *)int_to_test, (void *)sums, number_of_items_in_sums, sizeof(int), compare) == NULL)
errx(1, "not in list!");
printf("found it\n!");
bsearch语法来自内存,因此请仔细检查您的手册页。