编写一个高效的算法来搜索
m x n矩阵matrix中的一个目标值target。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
解法1 暴力解法
思路
按照暴力的思路就是每一行遍历呗...如果相等直接 return 。
(没想到暴力竟然ac了..笑哭hhh)
代码
function searchMatrix(matrix: number[][], target: number): boolean {
for (let i of matrix) {
for (let j of i) {
if (j === target) {
return true;
}
}
}
return false;
};
时空复杂度
时间复杂度:两层遍历,最差遍历n,虽有提前返回,但趋近于O(n^2)
空间复杂度:O(1),没有使用额外辅助空间
解法2 利用升序特性
矩阵是每行是从上往下升序。如果 matrix[i][j] 大于目标,那么 matrix[*][j] 都会大于目标。
所以最好从最后开始入手,从右往左,从上往下过滤。
代码
function searchMatrix(matrix: number[][], target: number): boolean {
const m = matrix.length; // 不是正方形矩阵
const n = matrix[0].length;
let i = 0;
let j = n - 1;
while (i < m && j >= 0) {
if (matrix[i][j] === target) {
return true;
} else if (matrix[i][j] > target) {
j --;
} else {
i ++;
}
}
return false;
};
时空复杂度分析
时间复杂度:时间复杂度为 O(m + n)
空间复杂度:O(1),仅使用常数变量空间