LeetCode-面试题 01.07. 旋转矩阵

题目

给你一幅由N × N矩阵表示的图像,其中每个像素的大小为 4字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

示例:

示例 1:

给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]

示例 2:

给定 matrix =
[
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
],
原地旋转输入矩阵,使其变为:
[
[15,13, 2, 5],
[14, 3, 4, 1],
[12, 6, 8, 9],
[16, 7,10,11]
]

解题思路

观察旋转矩阵和原矩阵的对应关系,可将图像旋转 90 度转换成两次翻转操作:

  1. 先沿着主对角线翻转(转置),即 m a t r i x [ i ] [ j ] = m a t r i x [ j ] [ i ] matrix[i][j] = matrix[j][i]
  2. 再沿中线左右翻转,即 m a t r i x [ i ] [ j ] = m a t r i x [ i ] [ n j 1 ] matrix[i][j] = matrix[i][n-j-1]
    比如:
    m a t r i x = [ 1 2 3 4 5 6 7 8 9 ] matrix=\left[ \begin{matrix} 1 & 2 & 3\\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{matrix} \right]
    沿着主对角线翻转(转置)后,
    m a t r i x = [ 1 4 7 2 5 8 3 6 9 ] matrix=\left[ \begin{matrix} 1 & 4 & 7\\ 2 & 5 & 8 \\ 3 & 6 & 9 \\ \end{matrix} \right]
    再沿中线左右翻转后,
    m a t r i x = [ 7 4 1 8 5 2 9 6 3 ] matrix=\left[ \begin{matrix} 7 & 4 & 1\\ 8 & 5 & 2 \\ 9 & 6 & 3 \\ \end{matrix} \right]
    最后得到的就是旋转90度后的矩阵,其中每转置一行就可以翻转一行。

代码

class Solution {
    public void rotate(int[][] matrix) {

        int n = matrix.length;
        for(int i=0;i<n;i++){
            //沿对角线翻转(转置)
             for(int j=i;j<n;j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
            //沿中线左右翻转
           for(int j=0;j<n/2;j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][n-j-1];
                matrix[i][n-j-1] = temp;
            }
        }
    }
}

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) ,其中 n n m a t r i x matrix 的边长。对于每一次翻转操作,我们都需要矩阵中一半的元素

  • 空间复杂度: O ( 1 ) O(1) ,为原地翻转得到的原地旋转。

发布了157 篇原创文章 · 获赞 1 · 访问量 2675

猜你喜欢

转载自blog.csdn.net/qq_34449717/article/details/105373624