首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求SubMatrix 3x3 JavaScript的最大和

求SubMatrix 3x3 JavaScript的最大和
EN

Stack Overflow用户
提问于 2018-10-26 07:43:02
回答 3查看 854关注 0票数 0

我用矩阵练习工作,但我被困在这里。我需要找到subMatrix的最大和。

代码语言:javascript
复制
const matrix = [ 
    [ 1,  1,  3,  3,  5],
    [-6, -7,  2, -3, -1],
    [ 3,  0, -4,  5,  9],
    [ 7, -7,  0,  1,  0],
    [-7, -6, -4, -4,  9],
]

当前矩阵为5x5。我需要找到3x3子矩阵的maxSum。所以这里的maxSum是19,我在这里突出强调子矩阵有这个和:

代码语言:javascript
复制
            +----------+
     1   1  |  3  3  5 | 
    -6  -7  |  2 -3 -1 | 
     3   0  | -4  5  9 | 
            +----------+
     7  -7     0  1  0
    -7  -6    -4 -4  9

脚本应该与更大的矩阵一起工作。我需要帮助,我不能让它在每个3x3矩阵上正确地迭代。

代码语言:javascript
复制
const subLength = 3 * 3;
let maxSum = 0;
for (let subMatrix = 0; subMatrix < subLength; subMatrix++) {
    let sum = 0;
    for (let rows = 0; rows < 3; rows++) {
        for (let cols = subMatrix; cols < matrix.length; cols++) {
            sum += matrix[rows][cols];
        }
    }
    if (maxSum < sum) {
        maxSum = sum;
    }
}
console.log(maxSum);

代码可以很好地处理这个矩阵,但对另一个不起作用,我知道问题是在第三个嵌套循环中,很可能是在第一个嵌套循环中。在第三部分中,我必须从0迭代到3,然后从1迭代到(3 + 1),从(3 + 2)迭代,然后在第二行的下一个数组上移动,然后再次从零开始。

你能修好我的密码吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-26 07:57:45

如果用两个外部循环替换外部循环会更容易一些:一个用于子矩阵的第一行,另一个用于其第一列。然后,两个内循环应该在从那里开始的子矩阵的3行和3列上迭代。

下面是更改最少的代码:

代码语言:javascript
复制
function maxSubSum(matrix, subLength) {
    let maxSum = 0;

    for (let firstRow = 0; firstRow <= matrix.length - subLength; firstRow++) {
        for (let firstCol = 0; firstCol <= matrix[0].length - subLength; firstCol++) {
            let sum = 0;
            for (let row = 0; row < 3; row++) {
                for (let col = 0; col < 3; col++) {
                    sum += matrix[firstRow+row][firstCol+col];
                }
            }
            if (maxSum < sum) {
                maxSum = sum;
            }
        }
    }
    return maxSum;
}

const matrix = [ 
    [ 1,  1,  3,  3,  5],
    [-6, -7,  2, -3, -1],
    [ 3,  0, -4,  5,  9],
    [ 7, -7,  0,  1,  0],
    [-7, -6, -4, -4,  9],
];

console.log(maxSubSum(matrix, 3));

当然,有更简洁的方法来编写这种代码,但是我决定坚持您已经尝试使用的模式。

票数 1
EN

Stack Overflow用户

发布于 2018-10-26 07:58:27

您可以使用reduce方法创建一个函数,该函数接受col和row params,并将它们从原始数组中切片,但是对于内部数组,只需反转元素顺序即可。

代码语言:javascript
复制
const matrix = [
  [1, 1, 3, 3, 5],
  [-6, -7, 2, -3, -1],
  [3, 0, -4, 5, 9],
  [7, -7, 0, 1, 0],
  [-7, -6, -4, -4, 9, 11, 40],
]

function sum(matrix, row, col) {
  return matrix.slice(0, row).reduce((r, e) => {
    [...e].reverse().slice(0, col).forEach(c => r += c)
    return r;
  }, 0)
}

console.log(sum(matrix, 3, 3))

或者,您可以从内部数组的末尾切片,再使用一次精简。

代码语言:javascript
复制
const matrix = [
  [1, 1, 3, 3, 5],
  [-6, -7, 2, -3, -1],
  [3, 0, -4, 5, 9],
  [7, -7, 0, 1, 0],
  [-7, -6, -4, -4, 9, 11, 40],
]

function sum(matrix, row, col) {
  return matrix.slice(0, row).reduce((r, e) => {
    return r + e.slice(-col).reduce((a, c) => a + c, 0)
  }, 0)
}

console.log(sum(matrix, 3, 3))

票数 0
EN

Stack Overflow用户

发布于 2018-10-26 08:01:12

你可以先得到矩阵的一部分,然后得到子矩阵的和。

代码语言:javascript
复制
const
    matrix = [[1, 1, 3, 3, 5], [-6, -7, 2, -3, -1], [3, 0, -4, 5, 9], [7, -7, 0, 1, 0], [-7, -6, -4, -4, 9, 11, 40]],
    cols = 3,
    rows = 3,
    left = -3,
    top_ = 0,                                   // top is a reserved property of windows
    sum = matrix
        .slice(top_, top_ >= 0 ? rows : undefined)
        .map(a => a.slice(left, left >= 0 ? cols : undefined))
        .reduce((r, a) => a.reduce((s, v) => s + v, r), 0);

console.log(sum);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53003817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档