Java实现矩阵原地转置交换matrix[i][j]与[j][i]失效问题
方阵原地转置实现失效问题排查
问题表现
尝试通过交换对称位置元素的思路实现矩阵原地(Inplace)转置,预期通过交换matrix[i][j]与matrix[j][i]的元素完成转置逻辑,但代码运行后未输出预期结果。
原有错误实现代码如下:
class Solution { public int[][] transpose(int[][] matrix) { for(int i = 0; i < matrix.length; i++){ for(int j = 0; j < matrix[0].length; j++){ int temp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp; } } return matrix; } }
实际运行测试:输入3阶方阵
[[1,2,3],[4,5,6],[7,8,9]]时,代码输出与原矩阵完全一致,未得到预期转置结果[[1,4,7],[2,5,8],[3,6,9]]。
根本原因
- 双层循环覆盖了矩阵所有坐标点,每一对对称位置的元素会被执行两次交换操作:第一次遍历到坐标
(i,j)时完成一次交换,后续循环遍历到对称坐标(j,i)时会再次交换这两个位置的元素,等于把元素换回了初始位置,最终整个矩阵没有任何变化。 - 以坐标
(0,1)和(1,0)为例:当i=0,j=1时,两个位置的元素2和4完成交换,此时这两个位置已经是转置后的正确值;但循环运行到i=1,j=0时,会再次交换这两个位置的元素,4和2回到原始位置,之前的交换操作完全失效。 - 额外说明:原地转置逻辑仅适用于行列数相等的方阵,如果输入矩阵行列数不相等,转置后矩阵维度会发生变化,无法在原数组空间内完成原地转置。
修正方法
调整内层循环的遍历范围,只遍历矩阵主对角线单侧的三角区域元素,保证每对对称位置的元素仅被交换一次即可。
修正后的代码如下:
class Solution { public int[][] transpose(int[][] matrix) { for(int i = 0; i < matrix.length; i++){ // j从i+1开始,仅遍历主对角线右上方的元素,避免重复交换 for(int j = i + 1; j < matrix[0].length; j++){ int temp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp; } } return matrix; } }
内容的提问来源于stack exchange,提问作者Uttam
相关产品推荐
相关产品推荐

