题解 | #顺时针旋转矩阵#

顺时针旋转矩阵

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

** 题解一: 一行一行的旋转 **
题解思路: 声明一个额外的数组ans,将ans保存旋转之后的数组。
位置摆放分析:
对于一个3阶矩阵-> 旋转90度之后坐标变换((0,0)--->(0,2);(0,1)-->(1,1) ; (0,2)--->(2,2)...) 所以 ans[j][n-1-i] = ans[i][j];
** 复杂度分析:**
时间复制度:O(N^2)
空间复杂度:O(N^2)
实现如下:

class Solution {
public:
    vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
        // write code here
      vector<vector<int>  > ans(n,vector<int>(n));
      for(int i = 0;i<n;i++){
          for(int j = 0;j<n;j++){
              ans[j][n-1-i] = mat[i][j];  // 摆放位置
          }
      }
      return ans;
    }
};

题解二:原地旋转
分析:有题解一得出的关系式mat[j][n-1-i] = mat[i][j];
图片说明

使用一个临时变量保存mat[j][n-1-i]的值,完成原地交换。
当n为偶数,需要枚举(n^2)/4个位置,当n为奇数,需要枚举(n^2-1)/4个位置。
图片说明
复杂度分析:
时间复杂度:O(N^2)
空间复杂度:O(1)
实现如下:

class Solution {
public:
    vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
        for(int i = 0; i<n/2;i++) //  行
        {
            for(int j = 0; j<(n+1)/2;j++)  //列
            {
                int tmp = mat[j][n-1-i]; // 临时变量保存mat[j][n-1-i]
                // 进行4次交换
                mat[j][n-1-i] = mat[i][j];
                mat[i][j] = mat[n-1-j][i];
                mat[n-1-j][i] = mat[n-1-i][n-1-j];
                mat[n-1-i][n-1-j] = tmp;
            }
        }
       return mat;     
    }
};

题解三:两次交换
分析如图:
图片说明
图片说明
复杂度分析:
时间复杂度:O(N^2)
空间复杂度:O(1)

实现如下:

class Solution {
public:
    vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
        //上下对称交换
        for(int i = 0; i<n/2;i++){
            for(int j = 0;j<n;j++){
                swap(mat[i][j], mat[n-i-1][j]);
            }
        }
        //主对角线交换
        for(int i = 0;i<n;i++){
            for(int j = i+1;j<n;j++){
                swap(mat[i][j], mat[j][i]);
            }
        }
        return mat;
    }
};
牛客网编程题题解 文章被收录于专栏

本专栏记录在牛客网上AC的每一题,写下题解。 未来2年完成2000编程题的题解。 2021.12.29更新,最进准备毕设,断更了,会尽快做完毕设,继续做这一件事情

全部评论
题解三的第一张图,蓝色部分上下交换画错了
点赞 回复 分享
发布于 2021-08-25 19:24
题解很棒!
点赞 回复 分享
发布于 2021-10-10 12:50
第二种为什么i j范围是一半?怎么确定?
点赞 回复 分享
发布于 2021-10-27 14:49
为什么第二种方法只能通过5组
点赞 回复 分享
发布于 09-13 14:53 上海

相关推荐

10-09 22:05
666 C++
找到工作就狠狠玩CSGO:报联合国演讲,报电子烟设计与制造
点赞 评论 收藏
分享
10-30 10:16
南京大学 Java
永远的鹅孝子:给南大✌️跪了
点赞 评论 收藏
分享
评论
13
收藏
分享
牛客网
牛客企业服务