鹏程 @ 2023-12-03 17:38:08
同样是二分查找,为什么这里使用递归法二分过不了#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。
请问递归的做法哪些地方影响了程序效率?
by XP3301_Pipi @ 2023-12-03 17:43:31
递归本身时间复杂度常数比较大,效率比较慢
所以一些DP题写记忆化搜索就可能会被卡掉