【模板】二分查找

二分查找

题目描述

给定一个包含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[]是将要进行查找的数组,na[]中的元素个数

附:如数据无序,则需要设结构体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;
}
发布了26 篇原创文章 · 获赞 16 · 访问量 1101

猜你喜欢

转载自blog.csdn.net/user_qym/article/details/104083513
今日推荐