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
相关产品推荐
相关产品推荐

