• 1236 - 二分查找


    1236 - 二分查找

    题目描述
    请在一个有序递增数组中(不存在相同元素),采用二分查找,找出值x的位置,如果x在数组中不存在,请输出-1!

    输入
    第一行,一个整数n,代表数组元素个数(n <= 106)

    第二行,n个数,代表数组的n个递增元素(1<=数组元素值<=108)

    第三行,一个整数x,代表要查找的数(0<=x<=108)

    输出
    x在数组中的位置,或者-1。

    样例
    输入
    10
    1 3 5 7 9 11 13 15 17 19
    3
    输出
    2
    说明
    请尝试采用递归和非递归两种方式来实现二分查找

    来源
    二分分治

    标签
    二分 分治

    题目链接
    1236 - 二分查找

    错误小结

    非递归

    1.n的数据范围太小
    2.数组能存储的元素太少,要7位数,这里只有5位数

    递归

    1.出现运行超时的现象
    2.数组能存储的元素太少,要7位数,这里只有5位数

    错误代码

    非递归错误代码

    #include
    using namespace std;
    int n,a[99999],m,r,l,mid;
    int main()
    {
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>a[i];
    	}
    	cin>>m;
    	l=0;r=n-1;
    	mid=(l+r)/2;
    	while(l<=r)
    	{
    		if(m==a[mid]){
    		r=mid+1;
    		cout<<r;
    		return 0;
    		}
    		if(a[mid]>m){
    			r=mid-1;
    		}
    		if(a[mid]<m){
    			l=mid+1;
    		}
    		mid=(l+r)/2;
    	}
    	cout<<"-1";
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    错误小结非递归

    1.n的数据范围太小
    2.数组能存储的元素太少,要7位数,这里只有5位数

    递归错误代码

    #include
    using namespace std;
    int n,a[99999];
    int maxn(int l,int r,int m)
    {
    	int mid;
    	mid=(l+r)/2;
    	if(m==a[mid]){
    	r=mid+1;
    	return r;
    	}
    	if(a[mid]>m){
    		r=mid-1;
    		return maxn(l,r,m);
    	}
    	if(a[mid]<m){
    		l=mid+1;
    		return maxn(l,r,m);
    	}
    }
    int main()
    {
    	int m,b=-1;
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>a[i];
    	}
    	cin>>m;
    	for(int i=0;i<n;i++)
    	{
    		if(a[i]==m)
    		b=1;
    	}
    	cout<<maxn(0,n-1,m);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    错误小结递归

    1.出现运行超时的现象
    2.数组能存储的元素太少,要7位数,这里只有5位数

    正确代码

    非递归正确代码

    #include
    using namespace std;
    int n,a[1000005],m,r,l,mid;
    int main()
    {
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>a[i];
    	}
    	cin>>m;
    	l=0;r=n-1;
    	mid=(l+r)/2;
    	while(l<=r)
    	{
    		if(m==a[mid]){
    		r=mid+1;
    		cout<<r;
    		return 0;
    		}
    		if(a[mid]>m){
    			r=mid-1;
    		}
    		if(a[mid]<m){
    			l=mid+1;
    		}
    		mid=(l+r)/2;
    	}
    	cout<<"-1";
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    递归正确代码

    #include
    using namespace std;
    int n,a[1000005];
    int maxn(int l,int r,int m)
    {
    	int mid;
    	mid=(l+r)/2;
    	if(m==a[mid]){
    	r=mid+1;
    	return r;
    	}
    	if(a[mid]>m){
    		r=mid-1;
    		return maxn(l,r,m);
    	}
    	if(a[mid]<m){
    		l=mid+1;
    		return maxn(l,r,m);
    	}
    }
    int main()
    {
    	int m,b=-1;
    	cin>>n;
    	for(int i=0;i<n;i++)
    	{
    		cin>>a[i];
    	}
    	cin>>m;
    	for(int i=0;i<n;i++)
    	{
    		if(a[i]==m)
    		b=1;
    	}
    	if(b!=1)
    	cout<<b;
    	else
    	cout<<maxn(0,n-1,m);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    再见!记得三连哦

  • 相关阅读:
    mmclassification 训练自定义数据
    汽车标定技术(九)--标定常量与#pragma的趣事
    【机器学习】特征工程:特征选择、数据降维、PCA
    【JVM盲点补漏系列】「并发编程的难题和挑战」深入理解JMM及JVM内存模型知识体系
    Web前端高频面试题解析(javascript篇)--- 每日十题(6)
    超好用,分享8个 Python 自动化脚本
    径向基函数拟合
    亚马逊云科技的AI新引擎,如何助力企业应对“乌卡时代”?
    Android ViewPager2 + Fragment + BottomNavigationView 联动
    小白从CentOS7到安装CDH6.3.2入坑实操指北(一)
  • 原文地址:https://blog.csdn.net/Song331/article/details/127656907