一次二分

class Solution {

    // 法1. 一次二分
    public boolean searchMatrix(int[][] matrix, int target) {
        for (int i = 0; i < matrix.length; i++) {
            if (matrix[i][matrix[i].length - 1] >= target) {
                boolean t = binarySearch(matrix, target, i);
                if (t == true) return true;
            }
        }
        return false;
    }

    private boolean binarySearch(int[][] matrix, int target, int row) {
        int length = matrix[row].length;
        int l = 0, r = length - 1, m;
        while (l <= r) {
            m = l + (r - l) / 2;
            if (matrix[row][m] == target) return true;
            else if (matrix[row][m] < target) l = m + 1;
            else r = m - 1;
        }
        return false;
    }
}

两次二分

二分查找系列

class Solution {

    // 法2. 两次二分
    public boolean searchMatrix(int[][] matrix, int target) {
        // 对于在哪一列进行二分查找,还可以进行一次二分
        int l = 0, r = matrix.length - 1, m;
        while (l <= r) {
            m = l + (r - l) / 2;
            if (matrix[m][0] <= target) l = m + 1;
            else r = m - 1;
        }
        if (r < 0) return false;
        return binarySearch(matrix, target, r);
    }

    private boolean binarySearch(int[][] matrix, int target, int row) {
        int length = matrix[row].length;
        int l = 0, r = length - 1, m;
        while (l <= r) {
            m = l + (r - l) / 2;
            if (matrix[row][m] == target) return true;
            else if (matrix[row][m] < target) l = m + 1;
            else r = m - 1;
        }
        return false;
    }
}