题解 | #顺时针旋转矩阵#如何实现空间复杂度O(1)

顺时针旋转矩阵

http://www.nowcoder.com/practice/2e95333fbdd4451395066957e24909cc

描述

有一个NxN整数矩阵,请编写一个算法,将矩阵顺时针旋转90度。
给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵。
数据范围:0 < n < 300,矩阵中的值满足 0val1000

问题分析:

    首先题目的数据不是很大,所以可以通过暴力解法,也就是直接定义一个二维数组,然后按照题目要求,逐个赋值。
但是我们可不可以在原数组上进行操作呢,通过对矩阵旋转的观察可以发现起规律。

a00,a01,...,a0n
a10,a11,...,a1n 
.                        .      
.                        .
an0,an1,...,ann

第一行的元素跟第一列的元素交换,第一列的元素跟最后一行的元素交换,最后一行的元素和最后一列的元素交换,
最后一列的元素跟第一行的元素交换。然后逐步向内。
如何实现交换看下面代码。需要注意的是4个顶点。

复杂负分析:

时间复杂度:第一次循环的次数为n-1,后面每次循环的次数递减2,只需要进行n/2次循环。
                      所以整个循环次数为:n(n-1)/4,时间复杂度为O(n2).
空间复杂度只定义了3个变量,所以空间复杂度为O(1).
class Solution {
public:
    vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
        // write code here
        if(1==n) return mat;
        int ul=0,rd=n-1,tmp;//ul表示上左的起始标志,rd表示右下标志
        while(ul<rd){
            for(int i=ul;i<rd;++i){
                tmp=mat[ul][i];//临时变量tmp保存第一个值,方便后面对各个位置赋值
                //因为i是变化的且ul也是变化的,所以对其赋值就需要将这两个因素考虑进去
                //如果后面不考虑ul,则会出现只有第一次循环的结果是正确的
                mat[ul][i]=mat[rd+ul-i][ul];
                mat[rd+ul-i][ul]=mat[rd][rd+ul-i];
                mat[rd][rd+ul-i]=mat[i][rd];
                mat[i][rd]=tmp;
            }
            ++ul,--rd;
        }
        return mat;
    }
};


全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
喜欢核冬天的哈基米很想上市:会爆NullPointerException的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务