📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
文章目录
- 牛客热题:旋转矩阵
- 题目链接
- 方法一:借用额外空间
- 思路
- 代码
- 复杂度
- 方法二:原地旋转
- 思路
- 代码
- 复杂度
牛客热题:旋转矩阵
题目链接
顺时针旋转矩阵_牛客题霸_牛客网 (nowcoder.com)
方法一:借用额外空间
思路
step1:创建额外的数组空间
step2:遍历原数组
step3:遍历数组的同时,将原数组中的元素,转换坐标后放入到旋转之后的数组内部
代码
vector<vector<int>> rotateMatrix(vector<vector<int> >& mat, int n)
{
vector<vector<int>> res(n, vector<int>(n));
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
{
res[j][n - i - 1] = mat[i][j];
}
return res;
}
复杂度
时间复杂度: O ( N 2 ) O(N ^ 2) O(N2), 遍历整个矩阵
空间复杂度: O ( N 2 ) O(N ^ 2) O(N2),利用了额外的数组空间来存储答案
方法二:原地旋转
思路
step1:先将原矩阵沿着对角线进行交换元素(注意这里第二个内部循环的上界是i,如果为n的话,相当于交换过来的元素,又交换过去了,相当于没交换)
spep2:将每一行的在本行内进行旋转就可以得到结果了
以样例为例子
begin:
1 | 2 | 3 |
---|---|---|
4 | 5 | 6 |
7 | 8 | 9 |
step1:
1 | 4 | 7 |
---|---|---|
2 | 5 | 8 |
3 | 6 | 9 |
step2:
7 | 4 | 1 |
---|---|---|
8 | 5 | 2 |
9 | 6 | 3 |
代码
vector<vector<int>> rotateMatrix(vector<vector<int> >& mat, int n)
{
for(int i = 0; i < n; ++i)
for(int j = 0; j < i; ++j)
{
swap(mat[i][j], mat[j][i]);
}
for(int i = 0; i < n; ++i)
reverse(mat[i].begin(), mat[i].end());
return mat;
}
复杂度
时间复杂度: O ( N 2 ) O(N ^ 2) O(N2),相当于遍历整个矩阵的时间复杂度
空间复杂度:O(1), 没有借助额外的空间实现了旋转矩阵