旋转矩阵

题目描述:

给你一幅由 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]

]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/rotate-matrix-lcci

题解:

该题目的数学描述为将一个N阶方形矩阵顺时针转动90°。

矩阵的顺时针旋转90°可以分解为先以反对角线为轴进行转置,再以水平中线为轴上下互换。

代码实现(C++和Go):

C++实现:

class Solution {

public:

    void rotate(vector>& matrix) {

        // 获取矩阵阶数

        int length = matrix.size();

        // 先按反对角线进行转置

        // 外层按行遍历

        for (int i = 0; i < length; ++i) {

            // 内层按列遍历,每次从左到右遍历的列索引不超过反对角线的列索引

            for (int j = 0; j < length -i; ++j) {

                swap(matrix[i][j], matrix[length - 1 -j][length - 1 - i]);

            }

        }

        // 再按中线进行上下互换

        // 外层循环只需到中线上的一列即可

        for (int i = 0; i < length / 2; ++i) {

            // 内层循环从第一列到最后一列

            for (int j = 0; j < length; ++j) {

                // 上下互换列的位置不变

                swap(matrix[i][j], matrix[length - 1 - i][j]);

            }

        }

    }

private:

    void swap(int &num1, int &num2) {

        int temp = num1;

        num1 = num2;

        num2 = temp;

    }

};

Go实现:

func rotate(matrix [][]int)  {

    length := len(matrix)

    for i := 0; i < length; i++ {

        for j := 0; j < length - i; j++ {

            matrix[i][j], matrix[length - 1 - j][length - 1 - i] = matrix[length - 1 - j][length - 1 - i], matrix[i][j]

        }

    }

    for i := 0; i < length / 2; i++ {

        for j := 0; j < length; j++ {

            matrix[i][j], matrix[length - 1 - i][j] = matrix[length - 1 - i][j], matrix[i][j]

        }

    }

}

你可能感兴趣的:(旋转矩阵)