## 题目地址

https://leetcode.com/problems/rotate-image/

## 题目描述

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.

Example 1:

``````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]
]

``````

Example 2:

``````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]
]
``````

## 思路

``````1  2  3　　　 　　 7  4  1

4  5  6　　-->　　 8  5  2

7  8  9 　　　 　　9  6  3

``````

(i, j) <- (n-1-j, i) <- (n-1-i, n-1-j) <- (j, n-1-i)

``````1  2  3               7  2  1            7  4  1

4  5  6      -->      4  5  6　　 -->  　 8  5  2

7  8  9               9  8  3　　　　   　 9  6  3

``````

``````class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for (int i = 0; i < n / 2; ++i) {
for (int j = i; j < n - 1 - i; ++j) {
int tmp = matrix[i][j];
matrix[i][j] = matrix[n - 1 - j][i];
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
matrix[j][n - 1 - i] = tmp;
}
}
}
};

``````

``````1  2  3　　　 　　 9  6  3　　　　　     7  4  1

4  5  6　　-->　　 8  5  2　　 -->   　 8  5  2

7  8  9 　　　 　　7  4  1　　　　　     9  6  3

``````

``````class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for (int i = 0; i < n - 1; ++i) {
for (int j = 0; j < n - i; ++j) {
swap(matrix[i][j], matrix[n - 1- j][n - 1 - i]);
}
}
reverse(matrix.begin(), matrix.end());
}
};

``````

``````1  2  3　　　 　　 1  4  7　　　　　     7  4  1

4  5  6　　-->　　 2  5  8　　 -->  　  8  5  2

7  8  9 　　　 　　3  6  9　　　　       9  6  3

``````

``````class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size();
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
swap(matrix[i][j], matrix[j][i]);
}
reverse(matrix[i].begin(), matrix[i].end());
}
}
};
``````

### 思路 2

``````var rotate = function(matrix) {
// 时间复杂度O(n^2) 空间复杂度O(n)
const oMatrix = JSON.parse(JSON.stringify(matrix)); // clone
const n = oMatrix.length;
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
matrix[j][n - i - 1] = oMatrix[i][j];
}
}
};
``````

• 矩阵旋转操作

## 代码

• 语言支持： JavaScript，Python3
``````/*
* @lc app=leetcode id=48 lang=javascript
*
* [48] Rotate Image
*/
/**
* @param {number[][]} matrix
* @return {void} Do not return anything, modify matrix in-place instead.
*/
var rotate = function(matrix) {
// 时间复杂度O(n^2) 空间复杂度O(1)

// 做法： 先沿着对角线翻转，然后沿着水平线翻转
const n = matrix.length;
function swap(arr, [i, j], [m, n]) {
const temp = arr[i][j];
arr[i][j] = arr[m][n];
arr[m][n] = temp;
}
for (let i = 0; i < n - 1; i++) {
for (let j = 0; j < n - i; j++) {
swap(matrix, [i, j], [n - j - 1, n - i - 1]);
}
}

for (let i = 0; i < n / 2; i++) {
for (let j = 0; j < n; j++) {
swap(matrix, [i, j], [n - i - 1, j]);
}
}
};
``````

Python3 Code:

``````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):
for j in range(i, n):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
for m in matrix:
m.reverse()

def rotate2(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
通过内置函数zip，可以简单实现矩阵转置，下面的代码等于先整体翻转，后转置；
不过这种写法的空间复杂度其实是O(n);
"""
matrix[:] = map(list, zip(*matrix[::-1]))
``````

评论
0 评论