今天在leetcode刷了一道矩阵转置问题,测试的时候发现二维数组的矩阵转置是分为两种情况的:第一种情况矩阵是方阵,矩阵的行列相等,如:
matrix = [[1,2,3],[4,5,6],[7,8,9]](n行n列);第二种情况矩阵行列不等,如:
matrix = [[1,2,3],[4,5,6]](m行n列)。
第一种情况,n行n列矩阵的转置:
这种情况下矩阵斜对角线上的元素在转置前后是不发生改变的,那么只需要考虑上三角或下三角上的元素。可以先测试几种情况,[0][1]转置后在数组中的下标变为了[1][0],[0][2]转置后在数组中的下标变为了[2][0],[1][2]转置后在数组中的下标变为了[2][1]。由此可见,当数组元素行下标小于数组元素列下标是,交换数组元素位置即可。
代码如下:
public class MatrixChange { public static void main(String[] args) { int[][] matrix =new int[][]{{1,2,3},{4,5,6},{7,8,9}}; int n = matrix.length; for(int i = 0;i < n; i++){ for(int j = 0;j < n; j++){ System.out.print(" " + matrix[i][j]); } System.out.println(); } System.out.println("n行n列矩阵转置后为: "); for(int i = 0;i < n; i++){ for(int j = 0;j < n; j++){ if(i < j){ //行下下标小于列下标时交换元素位置 int k = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = k; } System.out.print(" " + matrix[i][j]); } System.out.println(); } } }
第二种情况,m行n列矩阵的转置:
这种情况下只需将原数组元素的行下标与列下标交换后赋给新数组即可即可,如:[0][1]转置后在新数组中的下标变为了[1][0],[0][2]转置后在新数组中的下标变为了[2][0]。
代码如下:
public class MatrixChange { public static void main(String[] args) { int[][] matrix =new int[][]{{1,2,3},{4,5,6}}; int m = matrix.length,n = matrix[0].length; int[][] nums = new int[n][m]; for(int i = 0;i < m; i++){ for(int j = 0;j < n; j++){ System.out.print(" " + matrix[i][j]); } System.out.println(); } System.out.println("m行n列矩阵转置后为: "); for(int i = 0;i < m; i++){ for(int j = 0;j < n; j++){ nums[j][i] = matrix[i][j]; } } for(int i = 0;i < n;i++){ for(int j = 0;j < m; j++){ System.out.print(" " + nums[i][j]); } System.out.println(" "); } } }