法-:数学方法,顺时针90度,既将矩阵转置后每行元素再首尾交换。
法二,找规律分治,知晓旋转后元素的位置的列等于原来的行,原来的列+旋转后的行=n-1--->旋转后的列=n-1-原来的行。
package com.mona.array;
public class RotateImg {
//法-:数学方法,顺时针90度,既将矩阵转置后每行元素再首尾交换。
public void rotate(int[][] matrix) {
int n=matrix.length;
//转置,既矩阵对角线两边元素交换,既matrix[i][j]=matrix[j][i]
for (int i = 0; i < n; i++) {
//j=i,第j列转置后就不动了。转置下一行为下一列
for (int j = i; j < n; j++) {
int temp=matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=temp;
}
}
// 将每行元素交换
for (int i = 0; i < n; i++) {
int lp=0;
int rp=n-1;
for (int j = 0; j < n; j++) {
if (lp<rp){
int temp=matrix[i][lp];
matrix[i][lp]=matrix[i][rp];
matrix[i][rp]=temp;
lp++;
rp--;
}else break;
}
}
}
//法二,找规律分治,知晓旋转后元素的位置的列等于原来的行,原来的列+旋转后的行=n-1--->旋转后的列=n-1-原来的行。
public void rotate2(int[][] matrix) {
int n = matrix.length;
// 不区分子矩阵,直接遍历每一个元素
for( int i = 0; i < (n + 1)/2; i++ ){
for( int j = 0; j < n/2; j++ ){
int temp = matrix[i][j];
//ij旋转后的数值
matrix[i][j] = matrix[n-j-1][i];
//n-j-1,i为空,赋值旋转后的值
matrix[n-j-1][i] = matrix[n-i-1][n-j-1];
matrix[n-i-1][n-j-1] = matrix[j][n-i-1];
matrix[j][n-i-1] = temp;
}
}
}
public static void main(String[] args) {
int [][] matrix={{5,1,9,11},
{2,4,8,10},
{13,3,6,7},
{15,14,12,16}};
RotateImg rotateImg = new RotateImg();
rotateImg.rotate2(matrix);
for (int[] ints : matrix) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
}