[编程题] nk [二分查找的递归和非递归实现]

[编程题] nk 二分查找的递归和非递归实现

题目

image-20200731170149948

输入输出

见上

注意的问题

在二分查找的代码中,如果发现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;
}
posted @ 2020-07-31 17:06  北鼻coder  阅读(142)  评论(0编辑  收藏  举报