搜索二维矩阵

109 阅读1分钟

今天刷到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;
  }
}

感觉代码可以优化,怎么优化,还没想好