题目描述
利用二分查找找出所给出的数在数组中的下标
输入格式:
第一行输入n和m表示数组有n个数据,m表示要对m个数进行查找
输出格式:
所有输出在一行完成,行末没有多余空格和多余回车。
输入样例:
5 5
1 2 3 4 5
1 2 3 4 5
输出样例:
0 1 2 3 4
格外要注意mid=low+(high-low)/2,而不是mid = (low+high)/2,否则可能计算溢出;原因是int类型最大表示范围是2147483647
如果输入的low和high都接近2147483647,两个数相加就会溢出,变成一个负数。
#include <iostream>
using namespace std;
int main() {
int n, m;
scanf("%d %d", &n, &m);
int a[n];
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
for(int i = 0; i < m; i++) {
int t;
scanf("%d", &t);
if(i) printf(" ");
int low = 0, high = n-1;
while(low <= high) {
int mid = low+(high-low)/2;
if(a[mid] == t){
printf("%d", mid);
break;
}
else if(a[mid] > t){
high = mid-1;
}
else if(a[mid] < t) {
low = mid+1;
}
}
}
}