二维矩阵相关

120 阅读1分钟

搜索二维矩阵【leetcode-74】

题目描述:

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。 每行的第一个整数大于前一行的最后一个整数。

运行效率

MWJUDZ_3P(1M5PPDB_FIE24.png

解题思路

  • 使用二分法解答
    • 从0到总个数n-1,取中间的数,然后转换成坐标
    • 然后使用二分法解答

代码如下

function searchMatrix(matrix: number[][], target: number): boolean {
  if (!matrix.length) return false;
  let pre = 0;
  let end = matrix.length * matrix[0].length - 1;

  while (pre <= end) {
    let i = Math.floor((pre + end) / 2);
    const row = Math.floor(i / matrix[0].length);
    const col = i % matrix[0].length;
    if (matrix[row][col] < target) {
      pre = i + 1;
    } else if (matrix[row][col] > target) {
      end = i - 1;
    } else {
      return true;
    }
  }

  return false;
}

托普利茨矩阵【leetcode-766】

题目描述

托普利茨矩阵即从矩阵左上角到右下角的对角线上的元素相同,给定矩阵,判断是否是托普利茨矩阵

运行效率

MWJUDZ_3P(1M5PPDB_FIE24.png

代码如下

function isToeplitzMatrix(matrix: number[][]): boolean {
  function testDJX(i: number, j: number) {
    while (++i < matrix.length && ++j < matrix[0].length) {
      if (matrix[i][j] !== matrix[i - 1][j - 1]) {
        return false;
      }
    }
    return true;
  }

  if (!matrix.length) return true;

  for (let i = 0; i < matrix.length; i++) {
    if (!testDJX(i, 0)) {
      return false;
    }
  }
  for (let i = 1; i < matrix[0].length; i++) {
    if (!testDJX(0, i)) {
      return false;
    }
  }
  return true;
}