我有三个一维数组。任务是将存在于三个阵列中的每个阵列中的数字存储在第四个阵列中。这是我的解决方案,如你所见,是不正确的。如果可能的话,我也对更快的算法感兴趣,因为它是O(N3)难度。
#include <stdio.h>
main(){
int a[5]={1,3,6,7,8};
int b[5]={2,5,8,7,3};
int c[5]={4,7,1,3,6};
int i,j,k;
int n=0;
int d[5];
for(k=0; k<5; k++){
for(j=0; j<5; j++){
for(i=0; i<5; i++){
if(a[i]==b[j] && b[j]==c[k])
{d[n]=a[i];
n++;}
else
d[n]=0;
}}}
//Iterate over the new array
for(n=0;n<5;n++)
printf("%d\n",d[n]);
return 0;
}
答案 0 :(得分:7)
改进O(n log n)
的一种方法是首先对所有三个数组进行排序。
然后为每个数组使用三个指针。您始终移动指向最低值的那个,并在每次此类移动后检查这三个值是否相同。
为了进一步改进,您可以使用哈希表。
迭代第一个数组并将其值作为键放在哈希表中。
然后迭代遍历第二个数组,每次当值作为第一个哈希表中的键存在时,将其放在第二个哈希表中。
最后迭代第三个数组,如果第二个哈希表中存在一个值作为键,则将其存储在第四个数组中。这是O(n)
,假设哈希表操作是O(1)
。
答案 1 :(得分:3)
您的错误在于您正在使用三个嵌套计数器中的一个(用于索引输入数组)作为输出数组的索引。您需要有一个第四个索引(让我们称之为n
),从零开始,只有在找到满意的值时才会递增。
答案 2 :(得分:3)
预先对第二个和第三个数组进行排序,并对它们使用二进制搜索来确定是否存在某个元素。 如果所有数组中都存在元素 - 它将出现在第一个数组中。因此,请浏览第一个(未排序的)数组并检查其元素是否位于第二个和第三个。
如果你把最短的数组作为第一个 - 它也会使算法稍快一些。
答案 3 :(得分:1)
你没有以正确的方式将它们存储在d []上。
一旦找到,你可以跳过c []元素的[]和b []的其余部分。
#include <stdio.h>
main(){
int a[5]={1,3,6,7,8};
int b[5]={2,5,8,7,3};
int c[5]={4,7,1,3,6};
int i,j,k;
int n=0;
int found;
int d[5];
for(k=0; k<5; k++){
found=0;
for(j=0; j<5 && !found; j++){
if (b[j]==c[k]) {
for(i=0; i<5 && !found; i++){
if(a[i]==b[j]) {
d[n++]=c[k];
found=1;
}
}
}}}
//Iterate over the new array
for(i=0;i<5;i++)
printf("%d\n",d[i]);
return 0;
}