74. Search a 2D Matrix [Medium]

/**
 * 自己的代码,先遍历行找到数据可能在的行,再在行内二分查找到数据,没有则return false
 * 时间复杂度 O(logn + m)
 * Runtime: 0 ms, faster than 100.00%
 * Memory Usage: 38.5 MB, less than 29.70%
 */
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length, n = matrix[0].length, row = -1;
        for (int i = 0; i < m; i++) {
            if (target <= matrix[i][n - 1]) {
                row = i;
                break;
            }
        }
        if (row == -1) {
            return false;
        }
        int left = 0, right = n - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (matrix[row][mid] == target) {
                return true;
            }
            if (matrix[row][mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return false;
    }
}
/**
 * 完全二分查找的方法,先通过二分查找确定行,再通过二分查找确定是这一行的哪一个元素
 * 时间 O(logn + logm)
 * Runtime: 0 ms, faster than 100.00%
 * Memory Usage: 38.7 MB, less than 19.15%
 */
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int r1 = 0, r2 = matrix.length - 1, c1 = 0, c2 = matrix[0].length - 1;
        if (target < matrix[0][0] || target > matrix[r2][c2]) {
            return false;
        }
        while (r1 < r2) {
            int mid = (r1 + r2) / 2;
            if (matrix[mid][c2] == target) {
                return true;
            }
            if (matrix[mid][c2] > target) {
                r2 = mid;
            } else {
                r1 = mid + 1;
            }
        }
        while (c1 <= c2) {
            int mid = (c1 + c2) / 2;
            if (matrix[r1][mid] == target) {
                return true;
            }
            if (matrix[r1][mid] > target) {
                c2 = mid - 1;
            } else {
                c1 = mid + 1;
            }
        }
        return false;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值