题目描述
请在一个有序递增数组中(不存在相同元素),采用二分查找,找出值x的位置,如果x在数组中不存在,请输出-1!
输入格式
第一行,一个整数n,代表数组元素个数(n <= 10^6)
第二行,n个数,代表数组的n个递增元素(1<=数组元素值<=10^8)
第三行,一个整数x,代表要查找的数(0<=x<=10^8)
输出格式
x在数组中的位置,或者-1。
输入输出样例
输入 #1复制
10 1 3 5 7 9 11 13 15 17 19 3
输出 #1复制
2
#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[1000005]; // 用于存储输入的数组,预留足够空间
// 二分查找函数,查找是否存在值为x的元素
int search(int x) {
int l = 1 - 1, r = n + 1; // 初始化左右边界,l=0,r=n+1(包含哨兵)
while (l + 1 < r) { // 当区间长度大于1时继续循环
int mid = (r + l) >> 1; // 计算中间点,等价于 (l + r) / 2
if (a[mid] == x) { // 找到目标值
cout << mid;
return 0;
}
if (a[mid] < x) { // 中间值小于目标值,向右半区间查找
l = mid;
} else if (a[mid] > x) { // 中间值大于目标值,向左半区间查找
r = mid;
}
}
cout << -1; // 没有找到目标值
return 0;
}
int main() {
cin >> n; // 输入数组长度
for (int i = 1; i <= n; i++) { // 输入数组元素,从索引1开始
cin >> a[i];
}
a[0] = -1e9; // 设置左边界哨兵,确保查找不会越界
a[n + 1] = 1e9; // 设置右边界哨兵
cin >> m; // 输入要查找的目标值
search(m); // 调用查找函数
return 0;
}