旋转图像
题目来源:https://leetcode-cn.com/problems/rotate-image/
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。
请不要使用另一个 矩阵来旋转图像。
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
示例 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]
]
解一:先转置,再左右镜像
再数组中,通过两次反转可以 造成一次 旋转90°的效果,因此可以通过两次反转 操作:
1.转置一次 – 沿主对角线 对称交换
2.左右翻转一次
举个例子:
1 2 3 ****** 1 4 7 ****** 7 4 1
4 5 6 -----> 2 5 8 -----> 8 5 2
7 8 9 ****** 3 6 9 ****** 9 6 3
这样我们的代码就简单了。
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
/***************************************************************/
/***************************************************************/
//给出一个行数 或 列数 n
int n = matrix.size();
//主对角线反转---转置
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j) {
swap(matrix[i][j], matrix[j][i]);
}
//左右翻转
for (int i = 0; i < n; ++i)
for (int j = 0 ; j < n/2; ++j) {
swap( matrix[i][j],matrix[i][n - j - 1]);
}
}
};
解法2:将问题简化为 基于4个数 的子问题
解题思路
例1:
1 2 3
4 5 6
7 8 9
子问题:
1 3 9 7 和 2 6 8 4 和 5
例2:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
子问题:
1 4 16 13
2 8 15 9
3 12 14 5
6 7 11 10
对于 以 四个数 为子问题“旋转”,根据规律可以直接得出四个坐标
(**只需知道(i,j)即可得出另外3个**)
分别: 按 顺时针(n为行数==列数)
(i,j) (j,n-i-1) (n-i-1,n-j-1) (n-j-1,i)---然后按照顺时针旋转直接操作即可
对于一个n*n二维数组: 对 i,j的界限
i<=n/2 <==> i<n/2 + n%2;
j < n / 2
代码
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for (int i = 0; i <= n / 2 ; ++i) {
for (int j = 0; j < n / 2 ; ++j) {
swap(matrix[n - i - 1][n - j - 1],matrix[n - j - 1][i]);
swap(matrix[j][n - i - 1],matrix[n - i - 1][n - j - 1]);
swap(matrix[i][j],matrix[j][n - i - 1]);
}
}
}
};
对于 j的界限问题如果有合适的解释的话,还请各位解惑