leetcode 链接:旋转矩阵

题目

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


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

示例:

  1. 给定 matrix =
  2. [
  3. [1,2,3],
  4. [4,5,6],
  5. [7,8,9]
  6. ],
  7. 原地旋转输入矩阵,使其变为:
  8. [
  9. [7,4,1],
  10. [8,5,2],
  11. [9,6,3]
  12. ]
给定 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 度,将相当于将 matrix[i][j] 的值移动到 matrix[j][len - i - 1]len 为矩阵宽/高),这可以分解为两步翻转

  • matrix[i][j]matrix[j][i] 的值互换,即将矩阵沿“左上-右下”的对角线翻转
  • 再将 matrix[i][j]matrix[i][len - j - 1] 的值互换,即将矩阵水平翻转(即以每行的中点进行翻转)

image.png

class Solution {
public:
    void rotate(vector<vector<int>>& matrix) {
        int len = matrix.size();
        for(int i = 0; i < len; ++i)
        {
            for(int j = i + 1; j < len; ++j)
            {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }

        int mid = len / 2;
        for(int i = 0; i < len; ++i)
        {
            for(int j = 0; j < mid; ++j)
            {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[i][len - j - 1];
                matrix[i][len - j - 1] = temp;
            }
        }
    }
};

执行结果:

执行结果:通过

执行用时:0 ms, 在所有 C++ 提交中击败了 100.00% 的用户
内存消耗:6.8 MB, 在所有 C++ 提交中击败了 90.52% 的用户