3750: 二分查找时间限制(普通/Java):2000MS/6000MS 内存限制:65536KByte总提交: 13333 测试通过:4030 描述
将n个从小到大排序的整数(n<=1000000)从1~n进行编号,并给出一个待查找的整数,请使用二分法进行查找。
输入
第一行为n(n<=1000000)和m(m<=100000),n表示序列中的元素个数,m表示查询次数。 第二行为n个从小到大排序的整数,以空格分隔; 接下来有m行,每行一个待查询的整数。
输出
对于每次查询,如果能够在序列中找到待查询的整数,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None。
样例输入 10 2 样例输出 9
|
优化点:1、找到数字后,由于数组是有序的,所以直接从当前数字开始往前找,找到最前面的相同的数字的编号并输出。
2、当输入重复的数字时,会再调用一次函数找这个数字,会减慢效率,所以定义一个数组math来储存出现过的数字的编号,当有重复的数字出现时直接输出,并且continue进入下次循环
#include<stdio.h>
int erfen(int arr[],int low,int high,int x)
{
int mid;
while(low<=high)
{
mid=low+(high-low)/2;
if(arr[mid]==x)
{
while(mid>0&&arr[mid-1]==x)
{
mid--;
}
return mid+1;
}
if(arr[mid]<x)
{
low=mid+1;
}
else
{
high=mid-1;
}
}
return -1;
}
int a[1000005];
int math[1000005];
int main(void)
{
int n,m,x,number;
int i;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<m;i++)
{
scanf("%d",&x);
if(math[x]>0)
{
printf("%d\n",math[x]);
continue;
}
number=erfen(a,0,n-1,x);
if(number==-1)
{
printf("None\n");
}
else
{
math[x]=number;
printf("%d\n",number);
}
}
return 0;
}