如何判断输入矩阵是否为对称矩阵?现有JS校验代码运行出错求解决
对称矩阵校验函数修复方案
问题原因
- 现有函数仅实现了矩阵转置逻辑,没有完成对称性校验的步骤,最终仅返回了转置后的矩阵
- 若你之前将元素对比的if判断写在了转置的嵌套循环内,此时转置矩阵
array还没有完全生成,array[j][i]可能还未赋值,自然会得到错误结果 - 对称矩阵的前置校验缺失:没有先判断输入矩阵是否为方阵(行数等于列数),非方阵不可能是对称矩阵
修复后代码
const symmetricMatrix = function (MAT) { // 第一步:校验是否为方阵 const n = MAT.length; for (const row of MAT) { if (row.length !== n) return false; } // 生成转置矩阵,逻辑保持不变 const array = []; for (let i = 0; i < n; i++) { array.push([]); for (let j = 0; j < n; j++) { array[i].push(MAT[j][i]); } } // 第二步:逐元素对比原矩阵和转置矩阵的对应位置 for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { // 对比的是原矩阵[i][j]和转置矩阵[i][j],索引不要写错 if (MAT[i][j] !== array[i][j]) { return false; } } } // 所有校验通过才是对称矩阵 return true; }; // 测试示例 console.log( symmetricMatrix([ [1, 3, 1], [-1, 1, 4], [2, 1, 0], ]) ); // 输出:false,符合预期
优化方案
无需额外生成转置矩阵,直接对比矩阵对称位置的元素即可,空间复杂度可从O(n²)降至O(1),还可以只遍历上三角区域减少一半运算量:
const symmetricMatrix = function (MAT) { const n = MAT.length; // 校验方阵 for (const row of MAT) { if (row.length !== n) return false; } // 仅遍历上三角区域,对比对称位置元素 for (let i = 0; i < n; i++) { for (let j = i + 1; j < n; j++) { if (MAT[i][j] !== MAT[j][i]) { return false; } } } return true; };
内容的提问来源于stack exchange,提问作者john smith
相关产品推荐
相关产品推荐

