赞
踩
目标矩阵的行列数相同,均为n。此题是n×n型矩阵的旋转,重点把握好旋转前后行、列索引编号的变化。通过对旋转前后的索引编号进行分析,从而找出旋转后的变化关系即可。
当旋转第一行时,
(0,0) => (0,3)
(0,1) => (1,3)
(0,2) => (2,3)
(0,3) => (3,3)
当旋转第二行时,
(1,0) => (0,2)
(1,1) => (1,2)
(1,2) => (2,2)
(1,3) => (3,2)
设行索引编号为x,列索引编号为y,通过观察可发现,经过旋转后的列索引变为n - x - 1,行索引变为y。
因此可根据上述关系可知,旋转前matrix[x][y]
位置在旋转后的新位置便变为matrix[y][n-x-1]
参考文章:旋转矩阵
代码实现
class Solution {
public:
void rotate(vector<vextor<int>>& matrix){
int n = matrix.size();
auto matrix_new = matrix; // 这里的 = 拷贝值,将拷贝的值传给一个新的数组
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
matrix_new[j][n - i - 1] = matrix[i][j];
}
}
matrix = matrix_new;
}
};
时间复杂度为O(n2),空间复杂度为O(1)。
不新构建一个数组的情况下,不能直接旋转得到数组。便通过间接的方式,先按对角线进行翻转,再按中位线进行翻转,最终得到目标矩阵。
原始矩阵A:
当我们将矩阵以对角线为基准进行翻转时,可得到:
而我们的目标旋转矩阵的为:
可发现矩阵C和B的关系为对称翻转后的关系,即可通过将矩阵B以竖中位线来进行左右翻转,翻转后便可得到矩阵C。
同理,也可通过先将矩阵A2以横中位线为基准,将其进行上下翻转,得到矩阵B2再将矩阵B2以水平线反转,即可得到目标矩阵C。
参考文章:
秒懂系列!!!思路非常简单,代码也很易懂
代码实现
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; ++j) { swap(matrix[i][j], matrix[n - i - 1][j]); } } // 主对角线翻转 for (int i = 0; i < n; ++i) { for (int j = 0; j < i; ++j) { swap(matrix[i][j], matrix[j][i]); } } } };
时间复杂度为O(n2),空间复杂度为O(1)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。