这道题过了,但对二分查找实现的两种方法性能不理解
查看原帖
这道题过了,但对二分查找实现的两种方法性能不理解
80818
鹏程楼主2023/12/3 17:38

同样是二分查找,为什么这里使用递归法二分过不了#1,用while就可以通过#1?
递归法:

void find(int a[],int l,int r,int t){
	
	int mid=(r+l)>>1;
	if(a[mid]==t){
		
		ans=min(mid,ans);
		d[t]=ans;
		find(a,l,mid-1,t);
	}
	else if(l-r>0){
		return;
	}else{
		if(t<a[mid]){
			find(a,l,mid-1,t);
		}else{
			find(a,mid+1,r,t);
		}
	}
}

得分84,#1开O2优化后依旧超时;
while法:

void find(int a[],int l,int r,int t){
    while(l<=r){
        int mid=(r+l)>>1;
        if(a[mid]==t){
            ans=min(mid,ans);
            d[t]=ans;
            r=mid-1;
        }else if(t<a[mid]){
            r=mid-1;
        }else{
            l=mid+1;
        }
    }
}

满分,且#1测试点耗时60ms。
请问递归的做法哪些地方影响了程序效率?

2023/12/3 17:38
加载中...