二分查找的提出
一、问题的提出
有N个整数构成一个数组A,第i个整数是A[i]。
有Q个问题,第i个给出一个整数Xi,表示询问数组A是否包含Xi,包含就输出"yes",否则输出"no"。
数据范围:
N<=100000
Q<=100000
对于60%的数据,0<=A[i], Xi<=1000000,。
对于100%的数据,0<=A[i], Xi<=10^9
二、问题的分析
1、对于每个询问,可以用for循环在A数组查找一遍,检查是否能找到。
这种算法,每一个询问,都需要查询O(N)次,总时间复杂度是(N*Q)。
2、对于60%的数据,可以用数组下标计数的方法,大致框架如下:
bool in[1000001];
int x, y;
for(int i=1; i<=N; i++) {
cin>>y;
in[y] = true; //数组下标对应的数标记为true
}
for(int i=1; i<=Q; i++){
cin>>x;
if(in[x] == true) cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
三、二分查找的提出
第1个举例:N=10
A数组是:12 9 16 7 20 8 4 2 13 19
现在要询问A数组是否包含17。
步骤如下:
1、把A数组从小到大排序:2 4 7 8 9 12 13 16 19 20