二分查找
题目描述
给定一个包含n个整数的数列{An}和包含m个不重复整数的数列{Bm}。
输出既包含于{An}也包含于{Bm}的整数的个数k。
输入格式
输入共4行:
第1行仅包含一个正整数n;
第2行包含n个整数Ai,数字之间用一个空格分隔;
第3行仅包含一个正整数m;
第4行包含m个整数Bi,数字之间用一个空格分隔。
输出格式
输出仅包含一个整数k。
输入样例 1
5
1 2 3 4 5
3
3 4 1
输出样例 1
3
提示
【数据范围】
0 < n ≤ 100,000
0 < m ≤ 50,000
0 ≤ Ai,Bi ≤ 10^9
这是一道模板题,考察二分查找
在此提供模板:
int search(int a[],int key,int n)
{
int mid,right,left;
left=0;right=n;
while(right>=left)
{
mid=(right+left)/2;
if(a[mid]==key)
return mid;
if(key>a[mid])
left=mid+1;
if(key<a[mid])
right=mid-1;
}
return -1;
}
在上面的模板中,key
代表要查找的量,a[]
是将要进行查找的数组,n
是a[]
中的元素个数
附:如数据无序,则需要设结构体Node
,用来储存在数组中的位置与数值
此题完整代码:
#include <iostream>
#include <algorithm>
using namespace std;
int a[100001],b[50001];
int bin(int a[],int key,int n)
{
int mid,right,left;
left=0;right=n;
while(right>=left)
{
mid=(right+left)/2;
if(a[mid]==key)
return mid;
if(key>a[mid])
left=mid+1;
if(key<a[mid])
right=mid-1;
}
return -1;
}
int main()
{
int i,n,j,m,c=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
//sort(a+1,a+n+1);
cin>>m;
for(i=1;i<=m;i++)
cin>>b[i];
//sort(b+1,b+m+1);
for(i=1;i<=m;i++)
{
if(bin(a,b[i],n)!=-1)
c++;
}
cout<<c;
return 0;
}