【发布时间】:2015-06-23 17:12:50
【问题描述】:
我有两个数组,分别是 a[] 和 b[]。我想搜索b中是否存在a的任何元素。请注意,我不想找到所有重复的事件,如果 a[] 中的任何一个元素存在于 b[] 中,我想报告它并在不检查 a[] 或 b[] 的其余部分的情况下中断
我对“break”的运作方式有些困惑。 'break' 可以跳出任何类型的循环 - for/while,但它只跳出它在代码中放置的“最内层循环”吗?
这是我的解决方案,请建议这种 O(n^2) 方法是否有更好的实现
#include <stdio.h>
int main(void)
{
int a[] = {1,2,3,4,5,6};
int b[] = {11,2,3,7,8,9,6,10,11};
int i = 0, j = 0;
int duplicate = 0;
for(i=0;i<sizeof(a)/sizeof(int);i++)
{
for(j=0;j<sizeof(b)/sizeof(int);j++)
{
if(a[i] == b[j])
{
printf("Duplicates found for [%d]\n",a[i]);
duplicate = 1;
break;
}
}
if(duplicate == 1)
{
break;
}
}
return 0;
}
【问题讨论】:
-
你能对数组进行排序吗?代替
O(n^2),您可以在O(2.n.log n + n)中进行搜索,这与O(n.log n)相同 -
如果您使用 O(nlogn) 排序(例如快速排序或归并排序)对每个数组进行排序,那么您可以在 O(n) 时间内遍历数组,从而产生 O(nlogn) 的整体复杂度.
-
是的,
break会跳出它找到的最近的循环,无论是for还是while -
另外...更大的缩进不会影响编译器的性能或执行速度,并且确实对程序员有帮助。
标签: c break duplicate-removal