矩阵顺(逆)时针旋转
问题:给定一个m*n的矩阵,顺时针把矩阵旋转90度。
- 先画出旋转后的数组(矩阵)
原数组:
顺时针旋转90度后的数组:
逆时针旋转90度后的数组:
- 观察旋转前后数组(矩阵)的变化
顺时针旋转:
原矩阵的第一行,变成了目标矩阵的最后一列。
原矩阵的第二行,变成了目标矩阵的倒数第二列。
原矩阵的第三行,变成了目标矩阵的倒数第三列。
…
通过分析我们要顺时针旋转,就是把原数组的行,变成列。说具体一点就是把原数组的第一行赋值给目标数组的的最后一列,在赋值的时候,保持原数组的顺序,把原数组的值赋值给目标矩阵,目标矩阵一列一列的接收,注意不是一行一行的接收。
逆时针旋转:
原矩阵的第一行,变成了目标矩阵的第一列并且数字方向相反了。
原矩阵的第二行,变成了目标矩阵的第二列并且数字方向相反了。
原矩阵的第三行,变成了目标矩阵的第三列并且数字方向相反了。
…
逆时针旋转,赋值的时候也是一列一列的接收,但要注意的是目标矩阵是倒着接收的,就是它是从最后一行往上接收的。
- 代码实现
顺时针旋转:
//顺时针90旋转矩阵
public int[][] Xuanzhuanshuzu1(int arry1[][], int m, int n) {
//m表示原数组的行,n表示原数组的列
int arry2[][] = new int[n][m];
int dst;
dst = m - 1;//因为要从最后一列向前赋值
for (int x = 0; x < m; x++, dst--) {
for (int y = 0; y < n; y++) {
arry2[y][dst] = arry1[x][y];
//在内循环中保持列不变,实现一列一列的赋值,同时也是从最后一列向前赋值
}
}
return arry2;
}
逆时针旋转:
//逆时针90旋转矩阵
public int[][] Xuanzhuanshuzu2(int arry1[][], int m, int n) {
int arry3[][] = new int[n][m];
int dst;
for (int x = 0; x < m; x++) {
dst = n -1;//因为要从最后一行向前赋值
for (int y = 0; y < n ; y++,dst--) {
arry3[dst][x] = arry1[x][y];
//在内循环中保持列不变,实现一列一列的赋值,同时也是从最后一行向前赋值
}
}
return arry3;
}
运行结果: