题目描述
有n个数(n<=1000000),这n个数已按从大到小顺序存放在一个数组中,然后有T次查询,每次输入一个数,要求用折半查找法找出该数在数组中第一次出现的位置。如果不在数组中输出0。
输入
第一行数组元素的个数n
第二行n个数组元素的值
第三行输入查询次数T (T<=100000)
往下有T行,每行输入一个需要查询的数字
输出
查找的值在数组中的位置
样例输入
10
10 9 8 7 6 5 4 3 2 1
2
9
5
样例输出
2
6
提示
注意:数组空间为1000000和100000
这个本来是一个原来的练习题,当时坑了好久,今天再来回味一下,这个题有很多坑点
用cin和cout是过不了的
这个题可能有很多的重复数字,仔细看题目要求就可以得到 找到某个数第一次出现的位置,所有你找到这个数不要高兴,还得往前找,此外还需要注意循环条件 left<right 不能有==
以查询 9为例 假如加上等于号
left right mid
1 10 5
1 5 3
1 3 2 此时a[mid]<=9 ,a[mid]就是 9,right =mid =2;
1 2 1 此时 a[mid]=10>9; left=mid+1;
2 2 2 此时 a[mid]= 9=9; right=mid=2;
2 2 2 .......进入死循环 gg
#include<cstdio>
using namespace std;
const int maxn=1000000+10;
int a[maxn],n,m,x;
int getpos(int x)
{
int left=1;
int right=n;
int mid;
while(left<right)
{
mid=(left+right)/2;
if(a[mid]<=x)
right=mid;
if(a[mid]>x)
left=mid+1;
}
if(a[left]==x)
return left;
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d",&x);
printf("%d\n",getpos(x));
}
return 0;
}