给你一幅由 N × N
矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 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] ]
其实这道题通过观察原矩阵和旋转后的矩阵可以发现原矩阵的第一行变成了旋转矩阵的最后一列,第二行变成了倒数第二列,第一行的第一个数变成了旋转矩阵最后一列的第一个数,以此类推,我们可知原矩阵矩阵中第 i 行的第 j 个元素,在旋转后,它出现在倒数第 i 列的第 j 个位置。即matrix[i][j]变成了matrix_new[j][n-i-1]。这样我们很容易写出代码
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int ms=matrix.size();
vector<vector<int>> matrix_new=matrix;
for(int i=0;i<ms;++i){
for(int j=0;j<ms;++j){
matrix_new[j][ms-i-1]=matrix[i][j];
}
}
matrix=matrix_new;
}
};
接下来我们采用一种不占用额外空间的写法,一步一步交换,先转置矩阵,然后反转每一行就可以得到结果矩阵
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n=matrix.size();
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
swap(matrix[i][j],matrix[j][i]);
}
}
for(int i=0;i<n;i++){
int m=0;
int k=n-1;
while(m<k){
swap(matrix[i][m],matrix[i][k]);
m++;
k--;
}
}
}
};
标签:matrix,示例,int,矩阵,旋转,面试,vector,金典题
From: https://blog.csdn.net/m0_73096516/article/details/142363632