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

这篇博客介绍了一个用于在一维表示的有序矩阵中查找目标值的高效算法。算法利用矩阵的特性,即每行和每列都是递增的,通过二分查找优化搜索过程。在Java中实现该算法,能在给定的矩阵中快速判断目标值是否存在。博客内容包括算法的思路、代码实现以及执行效率分析。
摘要由CSDN通过智能技术生成

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。

示例 1:
​​在这里插入图片描述
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:
在这里插入图片描述
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:

m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-10^4 <= matrix[i][j], target <= 10^4

思路

首先每行的数据从左到右依次增大,下面行的数据都比上面行的数据大。比起“杨氏矩阵”简单了一些。其中一种思路就是可以将二维矩阵转换为一维数组,然后根据一维数据的位置计算二维数组的位置

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
    	// 获取矩阵的行数和列数
        int m = matrix.length;
        int n = matrix[0].length;
        // 边界值考虑
        if (target < matrix[0][0] || target > matrix[m - 1][n - 1]) {
            return false;
        }
        // 二分查找
        int left = 0, right = m * n - 1, mid;
        while (left <= right) {
            mid = (left+right) >> 1 ;
            // 根据一维数组映射二维数组,mid/n就是这个数所在的行,mid % n就是这个数所在的列
            int midVal= matrix[mid / n][mid % n];
            if (target == midVal) {
                return true;
            } else if (target < midVal) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return false;
    }
}

执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:38.2 MB, 在所有 Java 提交中击败了11.09%的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值