题目描述
有 n个数(n≤1000000),这 n个数已按从大到小顺序存放在一个数组中,然后有 T次查询,每次输入一个数,要求用折半查找法找出该数在数组中第一次出现的位置。如果不在数组中输出 0
。
输入
第一行数组元素的个数 n。
第二行 n 个数组元素的值。
第三行输入查询次数 T(T≤100000)。
往下有 T 行,每行输入一个需要查询的数字。
输出
查找的值在数组中的位置。
输入输出样例
样例输入 #1
10
10 9 8 7 6 5 4 3 2 1
2
9
5
样例输出 #1
2
6
参考解答:
#include <iostream>
#include <cstdio>
using namespace std;
int arr[1000000];
int f(int length, int num);
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
int T, num;
scanf("%d", &T);
while (T--)
{
scanf("%d", &num);
printf("%d\n", f(n, num));
}
}
int f(int length, int num)
{
int up = length - 1, down = 0, mid;
int location = -1;
while (up >= down)
{
mid = (up + down) / 2;
if (arr[mid] < num)
up = mid - 1;
if (arr[mid] > num)
down = mid + 1;
if (arr[mid] == num)
{
up = mid - 1;
location = mid;
}
}
return location + 1;
}