面试题 01.07. 旋转矩阵
给定一幅由N × N矩阵表示的图像,其中每个像素的大小为4字节,编写一种方法,将图像旋转90度。
不占用额外内存空间能否做到?
示例 1:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
思路
先主对称轴翻转,再左右翻转。swap(a,b)占用了额外内存空间,用a=a+b;b=a-b;a=a-b;或者用a=a^b;b=a^b;a=a^b;来代替swap
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int len=matrix.size();
//对角线互换
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
//swap(matrix[i][j], matrix[j][i]);//借助了额外的内存
matrix[i][j] += matrix[j][i];
matrix[j][i] = matrix[i][j] - matrix[j][i];
matrix[i][j] = matrix[i][j] - matrix[j][i];
}
}
//左右颠倒
for(int i=0;i<len;i++){
for(int j=0;j<len/2;j++){
//swap(matrix[i][j], matrix[i][len-j-1]);//借助了额外的内存
matrix[i][j] = matrix[i][j] ^ matrix[i][len-j-1];
matrix[i][len-j-1] = matrix[i][j] ^ matrix[i][len-j-1];
matrix[i][j] = matrix[i][j] ^ matrix[i][len-j-1];
}
}
}
};