题目主要信息:
  • 给定一个nnn*n的矩阵,返回其顺时针90度旋转后的结果
举一反三:

学习完本题的思路你可以解决如下题目:

BM97. 旋转数组

方法:倒置翻转(推荐使用)

知识点:矩阵转置

矩阵转置是将上三角矩阵元素与下三角矩阵元素依据对角线位置对称互换,且该过程是可逆的。

思路:

这道题可能需要将矩阵画出来,观察一下旋转后的规律: alt

乍一看没有啥规律,但是旋转后的第一行是不是与原矩阵的第一列很像,就是其翻转之后的结果,那我们可以再尝试画出一个顺时针90度旋转后每行翻转的矩阵: alt 然后我们会惊喜得发现,这就是互为转置的两个矩阵。因为转置的可逆性,只要过程逆转,就可以得到顺时针旋转90度后的矩阵了。

具体做法:

  • step 1:遍历矩阵的下三角矩阵,将其与上三角矩阵对应的位置互换,其实就是数组下标交换后的互换。
  • step 2:遍历矩阵每一行,将每一行看成一个数组使用reverse函数翻转。

Java代码实现:

import java.util.*;
public class Solution {
    public int[][] rotateMatrix(int[][] mat, int n) {
        int length = mat.length;
        //矩阵转置
        for(int i = 0; i < length; ++i){
            for(int j = 0; j < i; ++j){
                //交换上三角与下三角对应的元素
                int temp = mat[i][j];
                mat[i][j] = mat[j][i];
                mat[j][i] = temp;
            }
        }
        //每行翻转
        for (int i = 0; i < length; i++) {
            for (int j = 0; j < length/2; j++){
                int temp = mat[i][j];
                mat[i][j] = mat[i][length - j - 1];
                mat[i][length - j - 1] = temp;
            }
        }
        return mat;
    }
}

C++代码实现

class Solution {
public:
    vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
        //矩阵转置
        for(int i = 0; i < n; i++) 
            for(int j = 0; j < i; j++)
                //交换上三角与下三角对应的元素
                swap(mat[i][j], mat[j][i]);
        //每行翻转
        for(int i = 0; i < n; i++) 
            reverse(mat[i].begin(), mat[i].end());
        return mat;
    }
};

Python实现代码:

class Solution:
    def rotateMatrix(self , mat: List[List[int]], n: int) -> List[List[int]]:
        #矩阵转置
        for i in range(n):
            for j in range(i):
                #交换上三角与下三角对应的元素
                temp = mat[i][j]
                mat[i][j] = mat[j][i]
                mat[j][i] = temp
        #每行翻转
        for i in range(n):
            mat[i].reverse()
        return mat

复杂度分析:

  • 时间复杂度:O(n2)O(n^2),转置需要遍历矩阵,逐行翻转也是O(n2)O(n^2)
  • 空间复杂度:O(1)O(1),常数级变量,没有使用额外辅助空间