描述:
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
思路:
使用Array.prototype.flat()直接扁平化数组:
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function(matrix, target) {
let arrFlat = matrix.flat(Infinity);
return arrFlat.indexOf(target) == -1 ? false : true;
};
但是这样在leetcode和牛客都会报错,flat is not a function
考虑算法实现:
- 特殊情况:数组为空,直接返回false;
- 矩阵是有序的,因此矩阵有两个有区分度的角:左下角和右上角,target比右上角大,行数+1,target比右上角小,列数-1;相等的话直接返回true。
- while循环监听ij的边界值
i < row && j >= 0
,如果跳出循环,则代表没有找到。返回false;
代码:
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function(matrix, target) {
if (matrix.length == 0) {
return false;
}
/* i,j是比较元素的坐标(下标),初始默认为右上角 */
/* col,row为矩阵的行数和列数*/
let [i, j, row, col] = [
0,
matrix[0].length - 1,
matrix.length,
matrix[0].length
];
while (i < row && j >= 0) {//while循环判断ij是否超出边界,超出则跳出循环
if (target == matrix[i][j]) {
return true; //查找成功
} else if (target < matrix[i][j]) {
//目标值比右上角小
j--; //纵坐标左移
} else {
//目标值比右上角大
i++; //横坐标左移
}
}
//循环已跳出,坐标已超出边界
return false; //值没有找到
};
也可以用for循环
function Find(target, array)
{
var row = array.length-1;
for(var i=row,j=0; i>=0 && j<array[i].length;){
if(target == array[i][j]){
return true;
}else if(target > array[i][j]){
j++;
continue;
}else if(target < array[i][j]){
i--;
continue;
}
}
return false;
}