这是我参与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
};