【100.搜索二维矩阵】

60 阅读1分钟

题目

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

 

示例 1:

输入: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出: true

题解

方式一:两次二分法

public boolean searchMatrix(int[][] matrix, int target) {
    int m = matrix.length;
    int n = matrix[0].length;
    
    // 找对应行
    int l = 0, r = m - 1, row = 0;
    while (l <= r) {
        int mid = l + (r - l) / 2;
        if (matrix[mid][0] > target) {
            r = mid - 1;
        } else if (matrix[mid][0] < target) {
            row = mid;
            l = mid + 1;
        } else {
            return true;
        }
    }
    
    // 找对应列
    l = 0;
    r = n - 1;
    while (l <= r) {
        int mid = l + (r - l) / 2;
        if (matrix[row][mid] > target) {
            r = mid - 1;
        } else if (matrix[row][mid] < target) {
            l = mid + 1;
        } else {
            return true;
        }
    }
    
    return false;
}

方式二:一次二分

public boolean searchMatrix(int[][] matrix, int target) {
    int m = matrix.length;
    int n = matrix[0].length;
    int l = 0, r = m * n - 1;
    while (l <= r) {
        int mid = l + (r - l) / 2;
        int cur = matrix[mid / n][mid % n];
        if (cur > target) {
            r = mid - 1;
        } else if (cur < target) {
            l = mid + 1;
        } else {
            return true;
        }
    }
    return false;
}

总结

算法:二分法