算法系列——二分法

目录

 

1.有序数组,查找某个值

2.有序数组,找满足>=value的最左位置

3.有序数组,找满足<=value的最右位置

4.局部最小值——二分法不止用法有序数组上


1.有序数组,查找某个值

2.有序数组,找满足>=value的最左位置

    @Test
    public void test01(){
        int[] arr={1,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};
        System.out.println(binary02(arr,3));
    }

    public int binary02(int[] arr,int target){
        if(arr==null || arr.length==0)
            return -1;
        int left=0,right=arr.length-1;
        int index=-1;
        while(left<=right){
           int mid=left+((right-left)>>1);
           if(arr[mid]>=target) {
               index=mid;
               right = mid - 1;
           }
           else
               left=mid+1;
        }
        return index;
    }

3.有序数组,找满足<=value的最右位置

@Test
    public void test01(){
        int[] arr={1,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};
        System.out.println(arr.length-1);
        System.out.println(binary03(arr,3));
    }

public int binary03(int[] arr,int target){
        if(arr==null || arr.length==0)
            return -1;
        int l=0,r=arr.length-1;
        int index=-1;
        while(l<=r){
            int mid=l+((r-l)>>1);
            if(arr[mid]<=target){
                index=mid;
                l=mid+1;
            }
            else
                r=mid-1;
        }
        return index;
    }

4.局部最小值——二分法不止用法有序数组上

定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小。 给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可。

注:数组中相邻的数不相等

    public int binary04(int[] arr){
        if(arr==null || arr.length==0)
            return -1;
        if(arr.length==1 || arr[0]<arr[1])
            return 0;
        if(arr[arr.length-1]<arr[arr.length-2])
            return arr.length-1;
        int left=1,right=arr.length-2;
        while(left<right){
            int mid=left+((right-left)>>1);
            if(arr[mid]>arr[mid-1])
                right=mid-1;
            else if(arr[mid]>arr[mid+1])
                left=mid+1;
            else return mid;
        }
        return left;
    }


 

猜你喜欢

转载自blog.csdn.net/qq_41041762/article/details/115035114