给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于300。
这个题目在leetcode做过,当时用的C++,基本思想就是固定处于对角线上两个顶点值,比如(0,n-1) 将最外面一圈的数字经过一个比较复杂的交换达到顺时针旋转一周的效果,然后把顶点逐渐往里缩,变成(1,n-2),直到全部旋转完成。
class Rotate {
public:
vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
subrotate(mat,0,n-1);
return mat;
}
void subrotate(vector<vector<int>>& matrix,int start,int end){
while(start<end){
for(int i=0;i<end-start;i++){
int temp=matrix[end-i][start];
matrix[end-i][start]=matrix[end][end-i];
matrix[end][end-i]=matrix[start+i][end];
matrix[start+i][end]=matrix[start][start+i];
matrix[start][start+i]=temp;
}
start++;
end--;
}
}
};
然而今天在讨论区看到了python的解法,真是知道真相的我眼泪掉下来。。。
# -*- coding:utf-8 -*-
class Rotate:
def rotateMatrix(self, mat, n):
return [x[::-1] for x in zip(*mat)]
怎么个意思呢?
zip的作用:比如X=[1,2,3],Y=[4,5,6],Z=[7,8,9]
a=zip(X,Y,Z)
a就为[(1,4,7),(2,5,8),(3,6,9)]
u=zip(*a)
u就为[(1,2,3),(4,5,6),(7,8,9)]
上面两者相当于一个逆向过程。
而x[::-1]就是把一个矩阵倒置了。
整个过程相当于把矩阵转置,再对每行进行倒置,刚好相当于顺时针旋转90度。
那么如果题目变成逆时针旋转呢,自然也可以用C++那样的方法去解,python的话只要先每行倒置,再进行转置就可以了。
python真是个奇妙的语言。