109 lines
2 KiB
Markdown
109 lines
2 KiB
Markdown
# Leetcode Rotate-Image
|
|
|
|
2022-09-02 15:40
|
|
|
|
> ##### Algorithms:
|
|
>
|
|
> #algorithm #math
|
|
>
|
|
> ##### Data structures:
|
|
>
|
|
> #DS #array
|
|
>
|
|
> ##### Difficulty:
|
|
>
|
|
> #coding_problem #difficulty-medium
|
|
>
|
|
> ##### Additional tags:
|
|
>
|
|
> #leetcode #CS_list_need_understanding
|
|
>
|
|
> ##### Revisions:
|
|
>
|
|
> N/A
|
|
|
|
##### Links:
|
|
|
|
- [Link to problem](https://leetcode.com/problems/rotate-image/)
|
|
- [Solution and explanation](https://leetcode.com/problems/rotate-image/solution/)
|
|
|
|
---
|
|
|
|
### Problem
|
|
|
|
You are given an `n x n` 2D `matrix` representing an image, rotate the image by **90** degrees (clockwise).
|
|
|
|
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.
|
|
|
|
#### Examples
|
|
|
|
**Example 1:**
|
|
|
|
![](https://assets.leetcode.com/uploads/2020/08/28/mat1.jpg)
|
|
|
|
```
|
|
**Input:** matrix = [[1,2,3],[4,5,6],[7,8,9]]
|
|
**Output:** [[7,4,1],[8,5,2],[9,6,3]]
|
|
```
|
|
|
|
**Example 2:**
|
|
|
|
![](https://assets.leetcode.com/uploads/2020/08/28/mat2.jpg)
|
|
|
|
```
|
|
**Input:** matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
|
|
**Output:** [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
|
|
```
|
|
|
|
#### Constraints
|
|
|
|
### Thoughts
|
|
|
|
> [!summary]
|
|
> This is a #math problem.
|
|
|
|
Mainly two ways
|
|
|
|
#### Method 1: rotate in rings
|
|
|
|
#TODO complete in this method.
|
|
|
|
#### Method 2: transpose and reflect
|
|
|
|
transpose reflects the matrix in `y = x`,
|
|
reflect changes matrix in axis y
|
|
|
|
### Solution
|
|
|
|
```cpp
|
|
class Solution {
|
|
|
|
void reflect(vector<vector<int>> &mat) {
|
|
// reflect in y axis.
|
|
int n = mat.size();
|
|
for (int i = 0; i < n; i++) {
|
|
for (int j = 0, half = n / 2; j < half; j++) {
|
|
swap(mat[i][j], mat[i][n - j - 1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
void transpose(vector<vector<int>> &mat) {
|
|
int n = mat.size();
|
|
for (int i = 0; i < n; i++) {
|
|
for (int j = 0; j < i; j++) {
|
|
swap(mat[i][j], mat[j][i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public:
|
|
void rotate(vector<vector<int>> &matrix) {
|
|
// transpose and reflect
|
|
|
|
transpose(matrix);
|
|
reflect(matrix);
|
|
}
|
|
};
|
|
```
|