在一个二维数组中,每一行都按照从左到右的顺序排序,每一列到按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var findNumberIn2DArray = function(matrix, target) {
if (matrix.length > 0 && matrix[0].length > 0) {
let row = 0, column = matrix[0].length - 1;
while(row < matrix.length && column >= 0) {
if (matrix[row][column] === target) { // 从右上角开始向左、向下寻找数字
return true;
} else if (matrix[row][column] > target) { // 当前数字大于目标数字,减少列向左找
--column;
} else { // 当前数字小于目标数字,增加行,向下找
++row;
}
}
}
return false;
};
复杂度分析
- 时间复杂度:O(n+m)。访问到的下标的行最多增加 n 次,列最多减少 m 次,因此循环体最多执行 n + m 次。
- 空间复杂度:O(1)。