给你一个满足下述两条属性的
m x n
整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数
target
,如果target
在矩阵中,返回true
;否则,返回false
。
解法1 暴力解法
代码
function searchMatrix(matrix: number[][], target: number): boolean {
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] === target) {
return true;
}
if (matrix[i][j] > target) {
return false;
}
}
}
return false;
};
时空复杂度
时间复杂度:O(mn)
空间复杂度:O(1)
解法2 二分查找
思路
这个二维数组是严格递增的,是不是把它拍平也是一个有序的一位数组?
那么我们是不是这样就好去做二分查找了,但是难点是给你一个 index
如何还原成二维数组的 row
和 col
呢?
其实从 index
还原 row
和 col
只和 n
相关,也就是 matrix[0].length
,地板除就是 row
,取模就是 col
。
代码
function searchMatrix(matrix: number[][], target: number): boolean {
let m = matrix.length;
let n = matrix[0].length;
let low = 0;
let high = m * n - 1;
while (low <= high) {
const index = Math.floor((low + high) / 2);
const row = Math.floor(index / n);
const col = index % n;
if (matrix[row][col] > target) {
high = index - 1;
} else if (matrix[row][col] < target) {
low = index + 1;
} else {
return true;
}
}
return false;
};
时空复杂度
时间复杂度:O(log(mn))
空间复杂度:O(1)