题目描述:
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。 不占用额外内存空间能否做到? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/rotate-matrix-lcci 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例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度到新数组即可。此步骤用笔画一下应该就可以理解:对于矩阵中第i行的第j个元素,在旋转后,它出现在倒数第i列的第j个位置。(官方题解中的原话和图,代码省略)
5 1 9 11 x x x 5 x x x x =旋转后=> x x x 1 x x x x x x x 9 x x x x x x x 11 x x x x x x 2 x 2 4 8 10 =旋转后=> x x 4 x x x x x x x 8 x x x x x x x 10 x
此题还可以用翻转来代替旋转,先水平翻转,再根据对角线(左上 --> 右下)翻转。代码如下:
java:
class Solution { public void rotate(int[][] matrix) { // 获取到N的长度 int n = matrix.length; // 上下翻转 for (int i = 0; i < n / 2; i++) { for (int j = 0; j < n; j++) { int temp = matrix[i][j]; matrix[i][j] = matrix[n - i - 1][j]; matrix[n - i - 1][j] = temp; } } // 沿着对角线翻转(左上 --> 右下) for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { int temp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp; } } } }
python:
class Solution: def rotate(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead. """ n = len(matrix) for i in range(n // 2): for j in range(n): matrix[i][j], matrix[n - i - 1][j] = matrix[n - i - 1][j], matrix[i][j] for i in range(n - 1): for j in range(i + 1, n): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
总结:
时间复杂度为O ( N 2 ) 。此题我没有写过多的分析,因为第一种方法都可以想的到,第二种方法则不容易想的到,但是知道了此方法也很容易理解。记住方法吧,也许会遇到原题呢。