题目
给定一个矩阵,求子矩阵的累加和最大值
- 矩阵遍历规则为按行区域遍历,以0行为起点,遍历剩余区域,以1行为起点遍历剩余区域,...
- 对于每一行的累加和最大值,就是通过子数组累加和最大值的方法去求子数组累加和最大值,对于0-1行,压缩数组,把第0行和第1行的元素按列相加,再求数组累加和最大值,因为子矩阵的累加和其实就是按列相加后再按行相加后的值,第0行到2行,压缩三行再求累加和
function process(arr) {
let max = -Infinity,
cur = 0, // 当前累加和
tempArr = []; // 压缩数组
// i,j为行的区域
for (let i = 0; i < arr.length; i++) {
tempArr = []; // 每次更新区域清空压缩数组
for (let j = i; j < arr.length; j++) {
cur = 0; // 每行重新计算累加和,因为会压缩数组
for (let k = 0; k < arr[0].length; k++) {
tempArr += arr[j][k];
cur += tempArr;
max = Math.max(max, cur);
cur = cur < 0 ? 0 : cur;
}
}
}
}