菜单

二分查找

duckflew
发布于 2020-10-20 / 178 阅读
0
0

二分查找

基本的二分查找

非递归

public int binarySearch(int []nums ,int target)
    {
        int low=0;
        int high=nums.length-1;
        int mid;
        while (low<=high)
        {
            mid=low+(high-low)/2;
            if (target==nums[mid])return mid;
            if (target>nums[mid])low=mid+1;
            if (target<nums[mid])high=mid-1;
        }
        return -1;
    }

递归

int binarysearch(int array[], int low, int high, int target) {
    if (low > high) return -1;
    int mid = low + (high - low) / 2;
    if (array[mid] > target)
        return binarysearch(array, low, mid - 1, target);
    if (array[mid] < target)
        return binarysearch(array, mid + 1, high, target);
    return mid;
}

下面是一个二分查找的变种题目
leetcode 74 二分查找一个二维矩阵 二维矩阵有序

 public boolean searchMatrix(int[][] matrix, int target) {
        return binarySearch(matrix,0,matrix.length*matrix[0].length,target);
    }
    public boolean binarySearch(int [][] array,int left,int right,int target)
    {
        if (left>=right)return false;
        int mid=(left+right)>>1;
        int row=mid/array[0].length;
        int col=mid%array[0].length;
        if (target>array[row][col])return binarySearch(array,mid+1,right,target);
        else if (target<array[row][col])return binarySearch(array,left,mid,target);
        else return true;
    }

核心思想就把当前的位置转化为对应的行和列 然后正常按照二分查找的思想来学就行了 在设置left和right的时候 注意一个问题 如果设置的right是无法访问到的index 那判断条件就是if(left>=right)retrun false;
例如 array[8] 最先开始搜索的 right=8 是无法访问到的
所以应该按照下面这样写

 if (target>array[row][col])
return binarySearch(array,mid+1,right,target);
else if (target<array[row][col])
return binarySearch(array,left,mid,target);

如果我设置初始的right=len-1的话
那就是下面这样写的

 if (target>array[row][col])
return binarySearch(array,mid+1,right,target);
else if (target<array[row][col])
return binarySearch(array,left,mid-1,target);

评论