#include <stdio.h>
int main()
{
int a, b, arr1[100000], arr2[100000], cnt=0;
scanf("%d %d", &a, &b);
for(int i = 0; i < a; i++)
{
scanf("%d", &arr1[i]);
}
for(int i = 0; i < b; i++)
{
scanf("%d", &arr2[i]);
}
for(int i = 0; i < a; i++)
{
for(int j = 0; j < b; j++)
{
if(arr1[i] == arr2[j]) cnt++;
}
}
printf("%d", cnt);
}
这是在arr1和arr2中查找相同数据计数的代码,a和b是arr1和arr2中的一些数据。
例如,在第一行输入3 3和 10 20 三十 11 20 30
输入,
arr1是[10,20,30],arr2是[11,20,30],相同的数据计数是2.有没有办法让算法更快?
任何帮助都会很棒!谢谢!
[已解决]使用二进制搜索
#include <stdio.h>
#include <algorithm>
using namespace std;
int binarySearch(int arr[], int l, int r, int x)
{
if (r >= l)
{
int mid = l + (r - l)/2;
if (arr[mid] == x) return mid;
if (arr[mid] > x) return binarySearch(arr, l, mid-1, x);
return binarySearch(arr, mid+1, r, x);
}
return -1;
}
int main(void)
{
int arr1[100001], arr2[100001], cnt=0, a, b;
scanf("%d %d", &a, &b);
for(int i = 0; i < a; i++) scanf("%d", &arr1[i]);
for(int i = 0; i < b; i++) scanf("%d", &arr2[i]);
sort(arr1, arr1+a);
sort(arr2, arr2+b);
for(int i = 0; i < a; i++)
{
int result = binarySearch(arr1, 0, a, arr2[i]);
if(result != -1) cnt++;
}
printf("%d", cnt);
return 0;
}
答案 0 :(得分:0)
现在这个问题的答案完全取决于你的输入约束。在您的情况下,数组a
和b
的大小起着至关重要的作用。
现在,如果您要对两个数组进行排序,那么复杂性将是O(a log(a))或O(b log(b)),无论哪个都很大。但在你的情况下,复杂性是O(a * b)。
现在的问题是,你的a * b&gt;排序的复杂性。如果一般情况下坚持使用以前的方法并不是更好,因为没有额外的开销,否则你可以选择排序和二进制搜索。
注意:无法快速制作算法,而是可以使用时间复杂度较低的其他算法。
我一般使用O()表示法只是为了避免任何进一步的混淆,所以如果我错了,请耐心等待。