力扣面试题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]
]

思路:

  1. 旋转90度,就相当于把矩阵先按主对角线翻转(a[i][j] = a[j][i]),再左右翻转(a[i][j] = a[j][N - 1 - j])
  2. 不使用额外内存空间,所以不能再定义一个矩阵转移进去。

难点疑惑:

Q:为什么额外使用一个变量temp,算作不使用额外内存空间?

A:因为额外使用一个变量temp,代码的空间复杂度依旧是O(1),temp占的空间在理论上是忽略不计的。

正确代码:

void rotate(int** matrix, int matrixSize, int* matrixColSize) {
    // 先进行主对角线翻转
    for(int i = 0; i < matrixSize; i++)
    {
        for(int j = 0; j < i; j++)
        {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
    // 再进行左右翻转
    for(int i = 0; i < matrixSize; i++)
    {
        for(int j = 0; j 

你可能感兴趣的:(leetcode,矩阵,算法,c语言)