二维差分数组的概念

前面介绍了一维差分数组的用法及案例,
差分数组概念及基础用例1
差分数组用例2
下面介绍一下二维差分数组的概念。

构造二维差分数组:

  • 创建与原始矩阵相同大小的差分数组
  • 第一行和第一列就是类似一维差分数组的写法,后 - 前
  • 剩下的就是减去差分数组中前面和上面的值,然后加上左上角的值,因为前面和上面都减去了左上角的值,相当于减了两遍,而我们只需要减去一遍即可。

根据二维差分数组还原出原始数组

  • 创建与差分数组相同大小的原始矩阵
  • 第一行和第一列就是类似一维差分数组的写法,累加
  • 剩下的就是加上差分数组中前面和上面的值,然后减去左上角的值
function constructDifferenceMatrix(matrix) {
  const n = matrix.length;
  const m = matrix[0].length;

  // 创建与原始矩阵相同大小的差分数组
  const diff = new Array(n);
  for (let i = 0; i < n; i++) {
    diff[i] = new Array(m).fill(0);
  }

  // 构建差分数组
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
      // 差分数组元素表示原始矩阵相邻元素之差
      diff[i][j] = matrix[i][j];
      if (i > 0) {
        diff[i][j] -= matrix[i - 1][j];
      }
      if (j > 0) {
        diff[i][j] -= matrix[i][j - 1];
      }
      if (i > 0 && j > 0) {
        diff[i][j] += matrix[i - 1][j - 1];
      }
    }
  }

  return diff;
}

function restoreMatrix(diff) {
  const n = diff.length;
  const m = diff[0].length;

  // 创建与差分数组相同大小的原始矩阵
  const matrix = new Array(n);
  for (let i = 0; i < n; i++) {
    matrix[i] = new Array(m).fill(0);
  }

  // 还原原始矩阵
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
      matrix[i][j] = diff[i][j];
      if (i > 0) {
        matrix[i][j] += matrix[i - 1][j];
      }
      if (j > 0) {
        matrix[i][j] += matrix[i][j - 1];
      }
      if (i > 0 && j > 0) {
        matrix[i][j] -= matrix[i - 1][j - 1];
      }
    }
  }

  return matrix;
}

// 创建二维矩阵
const matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
];

// 构建差分数组
const diff = constructDifferenceMatrix(matrix);
console.log("差分数组:", diff);

// 还原为原始矩阵
const matrix1 = restoreMatrix(diff);
console.log(matrix1);

你可能感兴趣的:(#,LeetCode刻意练习,前端语言知识点,算法,leetcode,javascript)