C#LeetCode刷题之#48-旋转图像(Rotate Image)

C#LeetCode刷题之#48-旋转图像(Rotate Image)

问题

给定一个 n × n 的二维矩阵表示一个图像。

将图像顺时针旋转 90 度。

说明:

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

给定 matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],

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

给定 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]
]

You are given an n x n 2D matrix representing an image.

Rotate the image by 90 degrees (clockwise).

Note:

You have to rotate the image in-place, which means you have to modify the input 2D matrix directly. DO NOT allocate another 2D matrix and do the rotation.

Given input matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],

rotate the input matrix in-place such that it becomes:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]

Given input matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
], 

rotate the input matrix in-place such that it becomes:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]

示例

public class Program {

    public static void Main(string[] args) {
        var matrix = new int[,] {
            { 1, 2, 3 },
            { 4, 5, 6 },
            { 7, 8, 9 }
        };

        Rotate(matrix);
        ShowArray(matrix);

        matrix = new int[,] {
            { 1, 2, 3, 4 },
            { 5, 6, 7, 8 },
            { 9, 10, 11, 12 },
            { 13, 14, 15, 16 }
        };

        Rotate2(matrix);
        ShowArray(matrix);

        Console.ReadKey();
    }

    private static void ShowArray(int[,] matrix) {
        var length = matrix.GetLength(0);
        for(var i = 0; i < length; i++) {
            for(var j = 0; j < length; j++) {
                Console.Write($"{ matrix[i, j]} ");
            }
            Console.WriteLine();
        }
        Console.WriteLine();
    }

    public static void Rotate(int[,] matrix) {
        var length = matrix.GetLength(0);
        for(var i = 0; i < length; i++) {
            for(var j = i; j < length; j++) {
                var swap = matrix[i, j];
                matrix[i, j] = matrix[j, i];
                matrix[j, i] = swap;
            }
        }
        for(var i = 0; i < length; i++) {
            for(var j = 0; j < length / 2; j++) {
                var swap = matrix[i, j];
                matrix[i, j] = matrix[i, length - j - 1];
                matrix[i, length - j - 1] = swap;
            }
        }
    }

    public static void Rotate2(int[,] matrix) {
        var length = matrix.GetLength(0);
        for(var i = 0; i < length / 2; i++) {
            for(var j = i + 1; j < length - i; j++) {
                var swap = matrix[i, j];
                matrix[i, j] = matrix[length - 1 - j, i];
                matrix[length - 1 - j, i] = matrix[length - 1 - i, length - 1 - j];
                matrix[length - 1 - i, length - 1 - j] = matrix[j, length - 1 - i];
                matrix[j, length - 1 - i] = swap;
            }
        }
    }

}

以上给出2种算法实现,以下是这个案例的输出结果:

7 4 1
8 5 2
9 6 3

13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4

分析:

显而易见,Rotate 和 Rotate2 的时间复杂度均为: O(n^{2})

本文由 .Net中文网 原创发布,欢迎大家踊跃转载。

转载请注明本文地址:https://www.byteflying.com/archives/3668

发表评论

登录后才能评论