Skip to content

Commit aeb35be

Browse files
committed
Add square matrix rotation
1 parent ae39a8b commit aeb35be

File tree

2 files changed

+133
-0
lines changed

2 files changed

+133
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# Ma Trận Vuông Xoay Tại Chỗ
2+
3+
## Yêu cầu
4+
5+
Bạn được cho một ma trận 2D `n x n` (biểu diễn cho hình ảnh). Hãy quay ma trận đó `90` độ (theo chiều kim đồng hồ).
6+
7+
**Lưu ý**
8+
9+
Xoay ma trận **tại chỗ**, có nghĩa là ta phải xoay trực tiếp lên ma trận 2D đầu vào, chứ **KHÔNG ĐƯỢC** thao tác lên một ma trận khác.
10+
11+
## Ví dụ
12+
13+
**Ví dụ 1**
14+
15+
```
16+
[
17+
[1, 2, 3],
18+
[4, 5, 6],
19+
[7, 8, 9],
20+
]
21+
```
22+
23+
Sau khi xoay ma trận trở thành:
24+
25+
```
26+
[
27+
[7, 4, 1],
28+
[8, 5, 2],
29+
[9, 6, 3],
30+
]
31+
```
32+
33+
**Ví dụ 2**
34+
35+
```
36+
[
37+
[5, 1, 9, 11],
38+
[2, 4, 8, 10],
39+
[13, 3, 6, 7],
40+
[15, 14, 12, 16],
41+
]
42+
```
43+
44+
Sau khi xoay ma trận trở thành:
45+
46+
```
47+
[
48+
[15, 13, 2, 5],
49+
[14, 3, 4, 1],
50+
[12, 6, 8, 9],
51+
[16, 7, 10, 11],
52+
]
53+
```
54+
55+
## Giải thuật
56+
57+
Ta sẽ cần thực hiện hai phản chiếu của ma trận:
58+
- phản chiếu theo chiều dọc
59+
- phản chiếu theo đường chiếu từ dưới cùng bên trái sang trên cùng bên phải
60+
61+
Hoặc ta cũng có thể phản chiếu theo đường chéo trên cùng bên trái/dưới cùng bên phải và phản chiếu theo chiều ngang.
62+
63+
Một câu hỏi phổ biến là làm thế nào để bạn tìm ra loại phản chiếu? Đơn giản chỉ cần xé một mảnh giấy hình vuông, viết một từ ngẫu nhiên lên đó ta sẽ biết được vòng quay của nó. Lật mảnh giấy lại đến khi tìm ra giải pháp.
64+
65+
Dưới đây là một ví dụ về cách dòng đầu tiên có thể được xoay bằng cách sử dụng xoay chéo trên cùng bên phải/dưới cùng bên trái cùng với xoay ngang.
66+
67+
68+
```
69+
Giả sử ta có một chuỗi ở dòng đầu ma trận:
70+
71+
A B C
72+
• • •
73+
• • •
74+
75+
Thực hiện phản chiếu chéo trên cùng bên phải/dưới cùng bên trái:
76+
77+
A B C
78+
/ / •
79+
/ • •
80+
81+
Giờ thì thực hiện phản chiếu ngang:
82+
83+
A → →
84+
B → →
85+
C → →
86+
87+
Chuỗi đã được xoay 90 độ:
88+
89+
• • A
90+
• • B
91+
• • C
92+
```
93+
94+
### Liên kết
95+
96+
- [LeetCode](https://leetcode.com/problems/rotate-image/description/)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* @param {*[][]} originalMatrix
3+
* @return {*[][]}
4+
*/
5+
export default function squareMatrixRotation(originalMatrix) {
6+
const matrix = originalMatrix.slice();
7+
8+
// Thực hiện phản chiếu chéo trên cùng bên phải/dưới cùng bên trái của ma trận.
9+
for (let rowIndex = 0; rowIndex < matrix.length; rowIndex += 1) {
10+
for (let columnIndex = rowIndex + 1; columnIndex < matrix.length; columnIndex += 1) {
11+
// Hoán đổi phần tử.
12+
[
13+
matrix[columnIndex][rowIndex],
14+
matrix[rowIndex][columnIndex],
15+
] = [
16+
matrix[rowIndex][columnIndex],
17+
matrix[columnIndex][rowIndex],
18+
];
19+
}
20+
}
21+
22+
// Thực hiện phản chiếu ngang của ma trận.
23+
for (let rowIndex = 0; rowIndex < matrix.length; rowIndex += 1) {
24+
for (let columnIndex = 0; columnIndex < matrix.length / 2; columnIndex += 1) {
25+
// Hoán đổi phần tử.
26+
[
27+
matrix[rowIndex][matrix.length - columnIndex - 1],
28+
matrix[rowIndex][columnIndex],
29+
] = [
30+
matrix[rowIndex][columnIndex],
31+
matrix[rowIndex][matrix.length - columnIndex - 1],
32+
];
33+
}
34+
}
35+
36+
return matrix;
37+
}

0 commit comments

Comments
 (0)