搜索二维矩阵(js解法)

244 阅读2分钟

这是我参与11月更文挑战的第2天,活动详情查看:[2021最后一次更文挑战]

题目

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

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

示例 1:

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

思路 根据题意已知,二维数组从左往右递增,从上往下递增,所以得出以下结论:

某列的某个数字,该数之上的数字,都比其小; 某行的某个数字,该数右侧的数字,都比其大; 所以,解题流程如下所示:

以二维数组左下角为原点,建立直角坐标轴。 若当前数字大于了查找数,查找往上移一位。 若当前数字小于了查找数,查找往右移一位。 由于二维矩阵固定列的「从上到下」或者固定行的「从左到右」都是升序的。

因此我们可以使用两次二分来定位到目标位置:

第一次二分:从第 0 列中的「所有行」开始找,找到合适的行 row

第二次二分:从 row 中「所有列」开始找,找到合适的列 col

代码


由于二维矩阵固定列的「从上到下」或者固定行的「从左到右」都是升序的。

因此我们可以使用两次二分来定位到目标位置:

第一次二分:从第 0 列中的「所有行」开始找,找到合适的行 row

第二次二分:从 row 中「所有列」开始找,找到合适的列 col


var searchMatrix = function(matrix, target) {
    let m = matrix.length;
    let n = matrix[0].length
    for(let i = 0; i < m; i++) { 
        if( matrix[i][n-1] >= target && target >= matrix[i][0] ) {
            console.log(i)
            for(let j = 0; j < n; j++) {
                if(matrix[i][j] === target) {
                    return true;
                }
            }
            return false
        }
    }
    return false
};