解题思路:
两种方法:一是使用lower_bound(a,a+n,x)函数,底层实现就是二分查找(整数二分);二是直接写二分查找代码。
法二图解:
题解:
1.使用lower_bound(a,a+n,x)函数
#include <bits/stdc++.h>
using namespace std;
int main()
{
int data[200];
for(int i = 0 ; i < 200 ; i ++)data[i] = 4 * i + 6;
//由于题目数组已经是从小到大,所以不需要再进行sort
int x;
cin >> x;
cout << (lower_bound(data, data + 200 , x) - data) << endl;
//data+200表示最后一个元素的下一个地址(地址 - 首地址 = 下标
//lower_boud表示找到第一个大于等于x的元素并返回地址
//lower_bound函数的底层实现就是二分查找
return 0;
}
2.直接写二分查找代码(模板)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int data[200];
for(int i = 0 ; i < 200 ; i ++)data[i] = 4 * i + 6;
int x;
cin >> x;
int l = -1, r = 199;
//l从-1开始,是因为r的取值范围从0~199,下面l+1!=r,所以当l为-1时,r才可能取到0
while(l + 1 != r)
{
int mid = (l + r)/2;//l和r的中间下标等于(l+r)/2***
if(data[mid] >= x)r = mid;
else l = mid;
}
cout << r;
return 0;
}
附:
整数二分模板(注意:r==数组的大小)