给定一个 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]
]
结果
思路
这一题只要找对了思路,就非常的简单。
一开始,我是想使用洋葱循环法来实现的,不过,C++这个语言不像 python,思路越是复杂往往就意味着代码量会呈几何倍增加。
所以,毫无疑问,洋葱循环是可以实现的,但是我比较懒。
于是想换一个思路。这一题的 tag 是数学,那么,如何从数学的角度来解决这个问题呢?
学过线性代数的应该还是有些印象的,矩阵旋转 90°,可以通过转置和翻转来达成相同的目的。这样一来,代码量无疑就简化了很多了。(洋葱法我大概构想了一下,会用到一个三重的 for 循环。。。)
这也是一个很浅显的道理,做事情不要总想着一蹴而就,换个角度,找对跳板,往往能够事半功倍 。
代码
void rotate(vector<vector<int>>& matrix) {
int len = matrix.size();
for(int i = 0 ; i < len ; i++){
for(int j = 0; j < i; j++){
swap(matrix[i][j],matrix[j][i]);
}
}
for(int i = 0 ; i < len ; i++){
reverse(matrix[i].begin(),matrix[i].end());
}
}
后记
附上 5 月份以来的提交记录。
一天提交 12 次是真的疯狂啊。。。不知道这一次的刷题能够坚持多久呢?