Ytu oj 折半查找

题目描述

有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;
}
发布了51 篇原创文章 · 获赞 21 · 访问量 3103

猜你喜欢

转载自blog.csdn.net/qq_44115065/article/details/99739615