二分查找:
请在一个有序递增数组中(不存在相同元素),采用二分查找,找出值 的位置,如果
在数组中不存在,请输出
!
输入格式
第一行,一个整数 ,代表数组元素个数(
)
第二行, 个数,代表数组的
个递增元素(
数组元素值
)
第三行,一个整数 ,代表要查找的数(
)
输出格式
在数组中的位置,或者
。
样例输入
10
1 3 5 7 9 11 13 15 17 19
3
样例输出
2
提示
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N], n, m;
int main() {
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
int x;
cin >> x;
int l = 1, r = n, mid;
while (l <= r) {
mid = (l + r) >> 1;
if (x <= a[mid]) r = mid - 1;
else l = mid + 1;
}
if (a[l] == x) cout << l;
else cout << -1;
return 0;
}
二分查找左侧边界:
请在一个有序不递减的数组中(数组中有相等的值),采用二分查找,找到值 第
次出现的位置,如果不存在
请输出
。
请注意:本题要求出 个
,每个
在数组中第一次出现的位置。
比如有66 个数,分别是:,那么如果要求
个数:
,在数组中第一次出现的位置,答案是:
。
输入格式
第一行,一个整数 ,代表数组元素个数(
)
第二行, 个整数,用空格隔开,代表数组的
个元素(
数组元素的值
)
第三行,一个整数 ,代表有要求出
个数首次出现的位置(
)
第四行, 个整数,用空格隔开,代表要找的数(
要找的数
)
输出格式
输出 行,含
个整数,按题意输出要找的每个数在数组中首次出现的位置,如果不存在这样的数,请输出
。
样例输入
6
1 2 2 2 3 3
3
3 2 5
样例输出
5 2 -1
提示
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll n, a[N], t, f[N];
void lower_bound(ll *n, ll *a, ll *t) {
ll l = 1, r = *n, ans = -1;
while (l <= r) {
ll mid = (l + r) >> 1;
if (a[mid] == *t) {
ans = mid;
r = mid - 1;
} else if (a[mid] > *t) {
r = mid - 1;
} else {
l = mid + 1;
}
}
cout << ans << " ";
}
int main() {
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
cin >> t;
for (int i = 1; i <= t; i ++ ) {
cin >> f[i];
lower_bound(&n, a, &f[i]);
}
return 0;
}