• [编程题] 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;
    }
    
  • 相关阅读:
    CF1442E. Black, White and Grey Tree
    CF1442D. Sum
    CF1444D. Rectangular Polyline
    arc107F
    外心与垂心关系
    CF1434E. A Convex Game
    CF1434D. Roads and Ramen
    arc106E
    arc106F
    CF704E. Iron Man
  • 原文地址:https://www.cnblogs.com/jiyongjia/p/13410768.html
Copyright © 2020-2023  润新知