题目描述
给定一个 $n*n$ 的二维矩阵,表示一张图片。
请将这张图片顺时针旋转 $90^{\circ}$。
注意:
你只能进行原地操作,即:直接修改矩阵的值,且不可以分配一个新的二维数组。
样例1
输入:
[
[1,2,3],
[4,5,6],
[7,8,9]
],
输出:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
样例2
输入:
[
[ 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]
]
算法
(操作分解) $O(n^2)$
直接操作旋转 $90^{\circ}$ 比较困难,我们可以将它分解成两个操作:
- 先以左上-右下对角条线为轴做翻转;
- 再以中心的竖线为轴做翻转;
时间复杂度:$O(n^2)$, 额外空间:$O(1)$
C++ 代码
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
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, k = n - 1;
j < k; j ++, k -- )
swap(matrix[i][j], matrix[i][k]);
}
};
总结了以下:
顺时针 90: 主对角线(从左上到右下)翻转,然后从中间水平反转
逆时针 90: 主对角线翻转,然后从中间上下翻转
顺时针180和逆时针180 都是先主对角线翻转,然后副对角线翻转
emm好像是这样
进行180°旋转的话,直接先上下旋转后左右旋转就完事了,考虑对角线感觉有点麻烦
不是很懂这个方法怎么做到逆时针180,顺时针倒是可以
好吧,我傻了,顺时针和逆时针是一样的,
逆时针90似乎可以通过先中间水平翻转,再主对角线翻转实现(顺时针调换顺序即可)
这里的第二步应该是以中间的横线(上下)翻转?
是以竖线为轴左右翻转~
哇,楼主还用了两个“pointer” 来对折
这样写更直观一些hh
让我来自己回复我自己,是的,哈哈哈
棒!之前忘记回复了( ˙˘˙ )
像这种方法,是只能对正方形的矩阵这样做是吧,如果行数和列数不想等怎么办呢
矩阵行数列数不相等时
所以我认为如果要旋转矩阵180度,是可以用上面同学总结的方法做;但是如果旋转矩阵90度,就得另寻出路了
这个观察是怎么得出来的呢,是所有的rotate image 都可以这样分解成两步么?比如说,逆时针循转90度
好像是的,逆时针90度=右上/左下对角线翻转+上下翻转
逆时针90度应该是左上/右下对角线翻转+上下翻转,或者右上左下对角线翻转+左右反转~