今天刷到leetcode240题目,搜索矩阵
思路:
- 将矩阵划分为正方型矩阵
- 沿着正方形矩阵对角线遍历
- 如果第一个位置小于搜索值,返回失败
- 如果对角线的值等于搜索值,返回成功
- 如果对角线的值大于搜索值,说明搜索值位于【左下】和【右上】角的矩阵中
- 如果不是正方形矩阵,则划分为各个正方形矩阵进行递归遍历查找
运行效果如下:
代码如下:
function searchMatrix(matrix: number[][], target: number): boolean {
return searchMatrixRolls(
matrix,
target,
0,
0,
matrix.length - 1,
matrix[matrix.length - 1].length - 1
);
function searchMatrixRolls(
matrix: number[][],
target: number,
i: number,
j: number,
x: number,
y: number
) {
const di = x - i;
const dj = y - j;
if (di === dj) {
return squareSearch(matrix, target, i, j, di);
} else if (di > dj) {
while (i + dj <= x) {
const res = squareSearch(matrix, target, i, j, dj);
if (res) {
return true;
}
i = i + dj + 1;
}
return i <= x && searchMatrixRolls(matrix, target, i, j, x, y);
} else {
while (j + di <= y) {
const res = squareSearch(matrix, target, i, j, di);
if (res) {
return true;
}
j = j + di + 1;
}
return j <= y && searchMatrixRolls(matrix, target, i, j, x, y);
}
}
function squareSearch(
matrix: number[][],
target: number,
i: number,
j: number,
ed: number
): boolean {
if (matrix[i][j] > target) {
return false;
}
if (ed === 0) {
return matrix[i][j] === target;
} else {
for (let t = 0; t <= ed; t++) {
if (matrix[i + t][j + t] === target) {
return true;
} else if (matrix[i + t][j + t] < target) {
continue;
} else {
let res = searchMatrixRolls(
matrix,
target,
i + t,
j,
i + ed,
j + t - 1
);
!res &&
(res = searchMatrixRolls(
matrix,
target,
i,
j + t,
i + ed - 1,
j + ed
));
return res;
}
}
}
return false;
}
}
感觉代码可以优化,怎么优化,还没想好