You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript:将二维数组分割为k阶方形区域并求和各区域最大值

实现矩阵分割为k×k区块并求和每个区块最大值

嘿,很高兴你想学习JavaScript处理矩阵的方法!你的需求是从左上角开始把矩阵分割成k×k的方形区域,取每个区域的最大值再加起来对吧?我来一步步帮你实现和理解~

核心思路

要完成这个需求,我们可以分成这几步来做:

  • 遍历所有k×k区块的起始位置:从左上角(0,0)开始,行和列每次都跳k个位置,这样就能定位到每个区块的左上角。
  • 对每个区块,遍历内部所有元素,找出最大值。
  • 把所有区块的最大值累加,得到最终结果。

基础实现代码(兼容边界情况)

下面是完整的代码,我加了详细注释,方便你理解每一步:

function sumOfMaxInKBlocks(matrix, k) {
  let totalSum = 0; // 存储所有区块最大值的总和
  const totalRows = matrix.length; // 矩阵的总行数
  const totalCols = matrix[0].length; // 矩阵的总列数(假设所有行长度一致)

  // 外层循环:遍历每个区块的起始行,步长为k
  for (let startRow = 0; startRow < totalRows; startRow += k) {
    // 内层循环:遍历每个区块的起始列,步长为k
    for (let startCol = 0; startCol < totalCols; startCol += k) {
      let currentBlockMax = -Infinity; // 初始化区块最大值为负无穷,确保能覆盖负数元素

      // 遍历区块内的每一行
      for (let row = startRow; row < startRow + k && row < totalRows; row++) {
        // 遍历区块内的每一列
        for (let col = startCol; col < startCol + k && col < totalCols; col++) {
          // 更新当前区块的最大值
          if (matrix[row][col] > currentBlockMax) {
            currentBlockMax = matrix[row][col];
          }
        }
      }

      // 如果区块存在有效元素(避免空区块),加到总和里
      if (currentBlockMax !== -Infinity) {
        totalSum += currentBlockMax;
      }
    }
  }

  return totalSum;
}

// 测试一下!
const testMatrix = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
  [13, 14, 15, 16]
];
console.log(sumOfMaxInKBlocks(testMatrix, 2)); // 输出44,对应四个区块的最大值6+8+14+16

关键知识点解释

  • 二维数组访问:matrix[row][col]就是矩阵中第row行、第col列的元素,注意JS里数组索引是从0开始的哦。
  • 边界处理:代码里的row < totalRows和col < totalCols是为了兼容矩阵行/列数不是k整数倍的情况。比如如果矩阵是5行,k=2,最后一个区块只有1行,代码依然能正确遍历并找最大值。
  • 初始化最大值:用-Infinity初始化是因为矩阵里可能存在负数,这样第一个元素肯定能替换掉初始值,不会出错。

进阶:只处理完整的k×k区块

如果你的需求是只处理严格k×k大小的区块(不足k行/列的部分直接忽略),可以修改外层循环的条件,确保起始位置加上k不会超出矩阵范围:

function sumOfMaxInCompleteKBlocks(matrix, k) {
  let totalSum = 0;
  const totalRows = matrix.length;
  const totalCols = matrix[0].length;

  // 只遍历能容纳完整k×k区块的起始行
  for (let startRow = 0; startRow + k <= totalRows; startRow += k) {
    // 只遍历能容纳完整k×k区块的起始列
    for (let startCol = 0; startCol + k <= totalCols; startCol += k) {
      let currentBlockMax = -Infinity;
      // 这里不用再判断边界,因为已经确保区块是完整的
      for (let row = startRow; row < startRow + k; row++) {
        for (let col = startCol; col < startCol + k; col++) {
          // 用Math.max简化最大值比较
          currentBlockMax = Math.max(currentBlockMax, matrix[row][col]);
        }
      }
      totalSum += currentBlockMax;
    }
  }

  return totalSum;
}

这里还用到了Math.max()方法,它可以直接比较两个值并返回较大的那个,让代码更简洁。

内容的提问来源于stack exchange,提问作者Vjollca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:08:01