给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:
图2:
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
解题思路
- 以图2 为例子
- 先自定义一个Point类,用于保存二维数组中的元素的下标位置
- 根据题意可理解为 :如图2:第一行的第一个元素,第四列第一个元素,第四行第四个元素,第四行第一个元素为一组 做旋转操作,用到一个辅助空间
- 然后 又到第分二组的四个数,即第一行的第二个元素,第四列第二个元素,第四行第三个元素,第三行第一个元素为一组 做旋转操作,用到一个辅助空间
- 依次把外层的每个分组的元素旋转,然后到内层 即可完成本题
class Point{
int x,y;
public Point(int x,int y){
this.x=x;
this.y=y;
}
Point(){}
public void setPoint(int x,int y){
this.x=x;
this.y=y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
public class LK48 {
static public void rotate(int[][] matrix) {
int temp=-1,n=matrix.length;
Point point[]=new Point[4];
for (int i=0;i<4;i++)
point[i]=new Point();
int t1=n%2==0?n/2:n/2+1;
for (int j=0;j<t1;j++) {
point[0].setPoint(0+j,0+j);
point[1].setPoint(n-1-j,0+j);
point[2].setPoint(n-1-j,n-1-j);
point[3].setPoint(0+j,n-1-j);
int len=point[1].x-point[0].x;
for (int i = 0; i < len ; i++){
temp = matrix[point[0].y][point[0].x];
matrix[point[0].y][point[0].x] = matrix[point[3].y][point[3].x];
matrix[point[3].y][point[3].x] = matrix[point[2].y][point[2].x];
matrix[point[2].y][point[2].x] = matrix[point[1].y][point[1].x];
matrix[point[1].y][point[1].x] = temp;
point[0].setPoint(point[0].getX()+1, point[0].getY() );
point[1].setPoint(point[1].getX() , point[1].getY()+1);
point[2].setPoint(point[2].getX()-1, point[2].getY() );
point[3].setPoint(point[3].getX() , point[3].getY()-1);
}
}
}