处理一下二分查找的边界问题
首先要知道是用数组存放数据a[],知道数组的大小N,要查找的数k
l,r两个指针,初始在数组的左右外面一位,中点m是(l+r)/2向下取整
只有if里面的<或<=需要修改,最后的返回值是l还是r需要考虑
if(a[m]<k)
左指针指向比k小的数返回右指针就是最小的k,相当于lower_bound()
,返回左指针就是第一个小于k的
if(a[m]<=k)
左指针指向小于等于k的,返回左指针就是最后一个k,相当于upper_bound()
,返回右指针就是第一个大于k的
#include<iostream>
#include<algorithm>
using namespace std;
int binarySearch(int a[], int N, int k) {
int l = -1, r = N, m;
while (l + 1 != r)
{
m = (l + r) / 2;
/*
* 如果要找的数在数组中存在,下标从 0 开始
* 比如 1 2 3 5 5 5 8 9
* k = 5
* 那么找第一个5 , 就是 < k 返回 r 相当于 lower_bound(a, a+N, k)-a
* 第二个5 , <=k 返回 l 相当于 upper_bound(a, a+N, k)-a
* 第一个 >5 的就是 <=k 返回 r
* <5 < k l
*
* 如果不存在
* 比如 k = 4
* 那么要把4放进去的位置就是 < k 返回 r
*
*/
if (a[m] < k) {
l = m;
}
else {
r = m;
}
}
return r;
}
int main() {
int N, a[100], k;
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> a[i];
}
cin >> k;
cout << binarySearch(a, N, k) + 1 << endl;
cout << upper_bound(a, a + N, k) - a + 1 << endl;
cout << lower_bound(a, a + N, k) - a + 1 << endl;
return 0;
}