mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-31 16:14:39 +08:00
128 lines
2.9 KiB
Markdown
Executable File
128 lines
2.9 KiB
Markdown
Executable File
# [48. Rotate Image](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](https://en.wikipedia.org/wiki/In-place_algorithm)**, 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]
|
||
]
|
||
|
||
|
||
## 题目大意
|
||
|
||
给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
|
||
|
||
|
||
## 解题思路
|
||
|
||
- 给出一个二维数组,要求顺时针旋转 90 度。
|
||
- 这一题比较简单,按照题意做就可以。这里给出 2 种旋转方法的实现,顺时针旋转和逆时针旋转。
|
||
|
||
```c
|
||
|
||
/*
|
||
* clockwise rotate 顺时针旋转
|
||
* first reverse up to down, then swap the symmetry
|
||
* 1 2 3 7 8 9 7 4 1
|
||
* 4 5 6 => 4 5 6 => 8 5 2
|
||
* 7 8 9 1 2 3 9 6 3
|
||
*/
|
||
void rotate(vector<vector<int> > &matrix) {
|
||
reverse(matrix.begin(), matrix.end());
|
||
for (int i = 0; i < matrix.size(); ++i) {
|
||
for (int j = i + 1; j < matrix[i].size(); ++j)
|
||
swap(matrix[i][j], matrix[j][i]);
|
||
}
|
||
}
|
||
|
||
/*
|
||
* anticlockwise rotate 逆时针旋转
|
||
* first reverse left to right, then swap the symmetry
|
||
* 1 2 3 3 2 1 3 6 9
|
||
* 4 5 6 => 6 5 4 => 2 5 8
|
||
* 7 8 9 9 8 7 1 4 7
|
||
*/
|
||
void anti_rotate(vector<vector<int> > &matrix) {
|
||
for (auto vi : matrix) reverse(vi.begin(), vi.end());
|
||
for (int i = 0; i < matrix.size(); ++i) {
|
||
for (int j = i + 1; j < matrix[i].size(); ++j)
|
||
swap(matrix[i][j], matrix[j][i]);
|
||
}
|
||
}
|
||
|
||
```
|
||
|
||
## 代码
|
||
|
||
```go
|
||
|
||
package leetcode
|
||
|
||
func rotate(matrix [][]int) {
|
||
row := len(matrix)
|
||
if row <= 0 {
|
||
return
|
||
}
|
||
column := len(matrix[0])
|
||
// rotate by diagonal 对角线变换
|
||
for i := 0; i < row; i++ {
|
||
for j := i + 1; j < column; j++ {
|
||
tmp := matrix[i][j]
|
||
matrix[i][j] = matrix[j][i]
|
||
matrix[j][i] = tmp
|
||
}
|
||
}
|
||
// rotate by vertical centerline 竖直轴对称翻转
|
||
halfColumn := column / 2
|
||
for i := 0; i < row; i++ {
|
||
for j := 0; j < halfColumn; j++ {
|
||
tmp := matrix[i][j]
|
||
matrix[i][j] = matrix[i][column-j-1]
|
||
matrix[i][column-j-1] = tmp
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
```
|