题目链接:
题目描述:
思路:
思路一
类似于把数组向右移动几位,每一个元素变换位置都能组成一个圈
只需要把每个圈里面的元素更换位置就行
下面看一圈里面经过的索引,以(0,1)为起始点
- 1:从(i,j)到(j,n-i-1)
- 2:从(j,n-i-1)到(n-i-1,n-j-1)
- 3:从(n-i-1,n-j-1)到(n-j-1,i)
- 4:从(n-j-1,i)到(i,j)
难点是观察坐标的变化:
需要旋转的起始点是1和2
循环的边界就是:i<n/2,j<(n+1)/2
思路二
通过翻转实现
要实现每个(i,j)变成对应的(j,n-i-1),需要两步:
- (i,j)到(n-i-1,j),水平翻转实现,只需要遍历水平上半部分
- (n-i-1,j)到(j,n-i-1),对角线翻转实现,只需要遍历对角线上半部分
实现代码:
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
for(int i = 0; i < n / 2; i++){
for(int j = 0; j < (n+1)/2; j++){
int tmp = matrix[i][j];
matrix[i][j] = matrix[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] = tmp;
}
}
}
}
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
for(int i = 0; i < n / 2; i++){
for(int j = 0; j < n; j++){
int tmp = matrix[i][j];
matrix[i][j] = matrix[n-i-1][j];
matrix[n-i-1][j] = tmp;
}
}
for(int i = 0; i < n ; i++){
for(int j = 0; j < i; j++){
int tmp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = tmp;
}
}
}
}