目录
了解二分查找
二分查找顾名思义,就是一半一半地去找指定的那个数,如一个数组(当然,给的这个数组一定是有序的)arr={1,2,3,4,5},我要找5,我得先看他的一半是小于五还是怎么样,如果说,他是小于5的(原本就是),他的左边界就应该等于一半的这个下标
数字炸弹
你们玩过数字炸弹吗?二分查找就像是玩数字炸弹一样~
数字炸弹,就是在1~100内随机取一个数,要想在最短次数内找到,不能从左往右依次去找(麻烦),从右往左也是不行的,这个时候,我们就要用到二分查找法了!
它的过程
了解了它的工作了,接下来就该想一想该怎么弄了,代码+注释:
while(1){//while循环
len=(l+r)/2;//取中间数加标
if(a[len]==m){//判断,如果大于M(指定的数)
int i=len;//i先等于中间数
while(a[i]==m){
i--;//循环i--,如果a[i]等于m,i--,为了找到第一个为指定数的下标
}
cout<<i+2<<endl;//输出,Q1:为什么-2不是-1?A1:因为不等的时候减了1,为了和实际一样得多+1(数组是由下标为0开始的)
return 0;//结束
}
else if(a[len]<m){//如果小于的话,指定的数应该在右边
r=len;//现在的左边界就应该是中间值
}
else{
l=len;//否则右边界等于中间值(当指定的数在左边时)
}
s++;//次数自增
if(s>n*10){//如果次数过多,就证明没有!
break;
}
}
样例题目
题目描述
给出有 n 个元素的由小到大的序列,请你编程找出某元素第一次出现的位置。(n<=10^6)
输入
第一行:一个整数,表示由小到大序列元素个数;下面 n 行,每行一个整数;最后一行一个整数 x,表示待查找的元素;
输出
如果 x 在序列中,则输出 x 第一次出现的位置,否则输出-1。
样例输入
5 3 5 6 6 7 6
样例输出
3
这个就是二分查找【分治算法】,Code
#include<iostream>
using namespace std;
int main()
{
//输入
int n;
cin>>n;
int m,a[n];
for(int i=0;i<n;i++) cin>>a[i];
cin>>m;
//二分查找
int len,l=n,r=0,s=0;
while(1){
len=(l+r)/2;
if(a[len]==m){
int i=len;
while(a[i]==m){
i--;
}
cout<<i+2<<endl;
return 0;
}
else if(a[len]<m){
r=len;
}
else{
l=len;
}
s++;
if(s>n*10){
break;
}
}
cout<<-1;
//程序成功
return 0;
}
点个赞,谢谢