旋转图像
大约 2 分钟
旋转图像
思路一
使用原地旋转的方法:
- 首先沿右上-左下对角线翻转(相当于翻转了270°);
- 交换后的数组此时与目标数组呈镜像,只需要交换每行左右两侧的元素即可(相当于再翻转180°),(270° + 180°) % 360° = 90°,步骤如下图所示。

实现
java实现
class Solution {
public void rotate(int[][] matrix) {
rotate_A(matrix);
}
public void rotate_A(int [][]matrix){
int sz = matrix.length;
// 首先进行对角线交换
for(int i=0;i<sz;i++){
for(int j=i;j<sz;j++){
int temp = matrix[i][j];
matrix[i][j]=matrix[j][i];
matrix[j][i]=temp;
}
}
// 然后每一行元素兑换
for(int i=0;i<sz;i++){
int left = 0;
int right = sz-1;
while(left < right){
int tmp = matrix[i][right];
matrix[i][right]=matrix[i][left];
matrix[i][left]=tmp;
left++;
right--;
}
}
}
}
go实现
func main() {
arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
rotate48(arr)
fmt.Println(arr)
}
func rotate48(matrix [][]int) {
if matrix == nil || len(matrix) == 0 {
return
}
/*首先对角反转*/
for i := 0; i < len(matrix); i++ {
for j := i + 1; j < len(matrix[i]); j++ {
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
}
}
/*纵向反转*/
left := 0
right := len(matrix) - 1
for left < right {
/*每次执行外层循环 idx初始化为0*/
for idx := 0; idx < len(matrix[left]); idx++ {
matrix[idx][left], matrix[idx][right] = matrix[idx][right], matrix[idx][left]
}
left++
right--
}
}
思路二
也可以按照主对角线进行旋转,然后横向反转即可。

实现
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
//先沿斜对角线翻转
for(int i = 0;i < n;i ++)
for(int j = 0;j < i;j ++){
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
//再沿垂直竖线翻转
for(int i = 0;i < n;i ++)
for(int j = 0, k = n - 1; j < k ; j++, k--){
int temp = matrix[i][k];
matrix[i][k] = matrix[i][j];
matrix[i][j] = temp;
}
}
}