74. 搜索二维矩阵(二分)

class Solution {
    // 两种二分模版
    public boolean searchMatrix(int[][] matrix, int target) {
        if(matrix.length == 0 || matrix[0].length == 0) return false;
        int m = matrix.length, n = matrix[0].length;
        int l = 0, r = m * n - 1;
        while(l <= r) { // 判断区间内所有点
            int mid = (l + r) >> 1;
            if(matrix[mid/n][mid%n] == target) return true;
            else if (matrix[mid/n][mid%n] < target) {
                l = mid + 1;
            }  else {
                r = mid - 1;
            }
        }
        return false;
    }

    public boolean searchMatrix(int[][] matrix, int target) {
    if(matrix.length == 0 || matrix[0].length == 0) return false;
    int m = matrix.length, n = matrix[0].length;
    int l = 0, r = m * n - 1;
    while(l < r) {  // 注意二分的两种终止条件l < r 没有判断完成区间内所有点l == r情况
        int mid = (l + r) >> 1;
        if(matrix[mid/n][mid%n] == target) return true;
        else if (matrix[mid/n][mid%n] < target) {
            l = mid + 1; // l 小的话一直向右逼近
        }  else {
            r = mid;  // mid-1和mid都可以
        }
    }    // 退出循环继续判断
    return matrix[l/n][l%n] == target;
    }
}
原文地址:https://www.cnblogs.com/yonezu/p/13269305.html