第四题稍微有点难度:第四题分析出来了 第五题就不难了:
这5道题目相应的递推解,留给你了~~
//二分查找在字符串数组arr中寻找最大的i,使得arr[i]<v,不存在则返回-1,
//递归版本
int BS_max_less(char **arr,char *v,int i,int j){
if(i==j){
if(strcmp(arr[i],v)<0){
cout<<"tag i==j,reurn i"<<endl;
return i;
}else{
cout<<"tag i==j,reurn -1"<<endl;
return -1;
}
}
if(i==j-1){
if(strcmp(arr[j],v)<0){
cout<<"tag i==j-1,reurn j"<<endl;
return j;
}else if(strcmp(arr[i],v)<0){
cout<<"tag i==j-1,reurn i"<<endl;
return i;
}else{
cout<<"tag i==j-1,reurn -1"<<endl;
return -1;
}
}
int mid=i+(j-i)/2;
if(!strcmp(arr[mid],v))
return BS_max_less(arr,v,i,mid);//注意mid的下标
else if(strcmp(arr[mid],v)>0)
return BS_max_less(arr,v,i,mid-1);
else
return BS_max_less(arr,v,mid,j);//注意mid的下标
}
//二分查找在字符串数组arr中寻找最小的i,使得arr[i]>v,不存在则返回-1,
//递归版本
int BS_min_larger(char **arr,char *v,int i,int j){
/*if(i==j){
if(strcmp(arr[i],v)>0){
cout<<"tag i==j,reurn i"<<endl;
return i;
}else{
cout<<"tag i==j,reurn -1"<<endl;
return -1;
}
}*/
if(i==j-1){
if(strcmp(arr[i],v)>0){
cout<<"tag i==j-1,reurn i"<<endl;
return i;
}else if(strcmp(arr[j],v)>0){
cout<<"tag i==j-1,reurn j"<<endl;
return j;
}else{
cout<<"tag i==j-1,reurn -1"<<endl;
return -1;
}
}
int mid=i+(j-i)/2;
if(!strcmp(arr[mid],v))
return BS_min_larger(arr,v,mid,j);//注意mid的下标
else if(strcmp(arr[mid],v)>0)
return BS_min_larger(arr,v,i,mid);
else
return BS_min_larger(arr,v,mid+1,j);//注意mid的下标
}