[编程题] nk 二分查找的递归和非递归实现
题目
输入输出
见上
注意的问题
在二分查找的代码中,如果发现A[mid] == val,此时不能直接返回mid,而是还是需要往前遍历,看是否有相同的数字,有相同的数字的话,返回最前边的该数的索引。
方法1:非递归
//方法1:非递归
public int getPos1(int[] A, int n, int val) {
int left = 0;
int right = n-1;
int mid;
while(left<=right){
mid = (left+right)/2;
if(A[mid]==val){
//注意这里出现相同的数字的时候,我们还是让往前边找一下,返回相同数的最前边的那个
while(mid-1>=0 && A[mid-1]==val){
mid--;
}
return mid;
}else if(A[mid]>val){
right = mid-1;
}else{
left = mid+1;
}
}
return -1;
}
方法2:递归实现
//方法2:递归解决
public int getPos(int[] A, int n, int val) {
return recursor(A,0,n-1,val);
}
public int recursor(int[] A,int left,int right,int val){
int l = left;
int r = right;
int mid = (l+r)/2;
while(l<=r){
if(A[mid]==val){
while(mid-1>=0 && A[mid-1]==val){
mid--;
}
return mid;
}else if(A[mid]>val){
return recursor(A,l,mid-1,val);
}else{
return recursor(A,mid+1,r,val);
}
}
return -1;
}