顺时针旋转矩阵

给定一个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真是个奇妙的语言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值