题目
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
解法一
其实所谓的旋转图像,说到底不就是数组中元素有规律的交换吗?那么这种正方形数组的旋转规律在哪里呢?其实我们可以将其想成一圈套一圈的数组,每圈中的数都是向前移动边长位来进行交换的。那么对于每一圈数组,我们就能设立四个指针变量,分别指向上下左右的起始元素,然后通过指针之间的元素交换与指针的前移来实现一圈圈的旋转。所以我们需要两重for循环,一重指圈数,另一重表示指针的移动。
class Solution {
public void rotate(int[][] matrix) {
int n = matrix.length;
int u,l,d,r; //分别表示上左下右四个指针,指针的添加有助于移动的理解
int temp; //做交换的变量
//i表示从外往里数第几圈,j表示下一个移动的位置
for(int i = 0;i < n/2;i++){
for(int j = i;j < n - i -1;j++){
//i在这里表示每圈固定的行或列,是不变的
u = r = j;
d = l = n-j-1;
temp = matrix[i][u];
matrix[i][u] = matrix[l][i];
matrix[l][i] = matrix[n-i-1][d];
matrix[n-i-1][d] = matrix[r][n-i-1];
matrix[r][n-i-1] = temp;
}
}
}
}
解法二
解法二呢我借鉴的就是Leecode中大佬的思路了
作者:数据结构和算法
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnhhkv/?discussion=55PjY0
来源:力扣(LeetCode)
他将数组先进行一次上下交换,再进行一次沿对角线交换,就得到了顺时针旋转90°的图像。
代码如下:
public void rotate(int[][] matrix) {
int length = matrix.length;
//先上下交换
for (int i = 0; i < length / 2; i++) {
int temp[] = matrix[i];
matrix[i] = matrix[length - i - 1];
matrix[length - i - 1] = temp;
}
//在按照对角线交换
for (int i = 0; i < length; ++i) {
for (int j = i + 1; j < length; ++j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}