前面介绍了一维差分数组的用法及案例,
差分数组概念及基础用例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);