解题思路:
首先如果二维数组是11或者22,直接蛮力计算;
如果是22以上,可以一圈一圈(rotate circle)地计算反转90度之后的结果。
比如,对于下面55的数组:
首先设置一个数组tmp将框1中的数字保存起来,
然后计算翻转后框1(top layer)中的数字;
再计算翻转后框2(left layer)中的数字;
再依次计算框3,4中的数字,这样就完成了最外圈的反转。
最外圈翻转之后的结果为:
接下来进行递归,对内层的圈进行相同的操作。
提交代码:
class Solution{
public void rotate(int[][] matrix) {
for(int i=0;i<matrix.length/2;i++) {
rotateCircle(matrix,i,i,matrix.length-2*i);
}
}
public void rotateCircle(int[][] matrix,int r,int c,int size) {
if(size==2) {
int tmp=matrix[r][c];
matrix[r][c]=matrix[r+1][c];
matrix[r+1][c]=matrix[r+1][c+1];
matrix[r+1][c+1]=matrix[r][c+1];
matrix[r][c+1]=tmp;
return;
}
int tmp[]=new int[size];
for(int i=0;i<tmp.length;i++)
tmp[i]=matrix[r][r+i];
//update the upper layer
for(int i=0;i<size;i++)
matrix[r][r+size-1-i]=matrix[r+i][c];
//update the left layer
for(int i=1;i<size;i++)
matrix[r+i][c]=matrix[r+size-1][c+i];
//update the bottom layer
for(int i=1;i<size-1;i++)
matrix[r+size-1][c+i]=matrix[r+size-i-1][c+size-1];
matrix[r+size-1][c+size-1]=tmp[tmp.length-1];
//update the right layer
for(int i=1;i<size-1;i++) {
matrix[r+i][c+size-1]=tmp[i];
}
}
}
运行结果: