Skip to content

Commit 25c77f3

Browse files
authored
feat: add solutions to lcci problems: No.01.07~01.09 (doocs#2094)
1 parent b44a398 commit 25c77f3

File tree

13 files changed

+404
-121
lines changed

13 files changed

+404
-121
lines changed

lcci/01.07.Rotate Matrix/README.md

+129-39
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,13 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54-
原地旋转,i 的范围是 `[0, n/2)`,j 的范围是 `[i, n-1-i)`
54+
**方法一:原地翻转**
55+
56+
根据题目要求,我们实际上需要将 $matrix[i][j]$ 旋转至 $matrix[j][n - i - 1]$。
57+
58+
我们可以先对矩阵进行上下翻转,即 $matrix[i][j]$ 和 $matrix[n - i - 1][j]$ 进行交换,然后再对矩阵进行主对角线翻转,即 $matrix[i][j]$ 和 $matrix[j][i]$ 进行交换。这样就能将 $matrix[i][j]$ 旋转至 $matrix[j][n - i - 1]$ 了。
59+
60+
时间复杂度 $O(n^2)$,其中 $n$ 是矩阵的边长。空间复杂度 $O(1)$。
5561

5662
<!-- tabs:start -->
5763

@@ -62,17 +68,13 @@
6268
```python
6369
class Solution:
6470
def rotate(self, matrix: List[List[int]]) -> None:
65-
"""
66-
Do not return anything, modify matrix in-place instead.
67-
"""
6871
n = len(matrix)
69-
for i in range(n // 2):
70-
for j in range(i, n - 1 - i):
71-
t = matrix[i][j]
72-
matrix[i][j] = matrix[n - j - 1][i]
73-
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1]
74-
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1]
75-
matrix[j][n - i - 1] = t
72+
for i in range(n >> 1):
73+
for j in range(n):
74+
matrix[i][j], matrix[n - i - 1][j] = matrix[n - i - 1][j], matrix[i][j]
75+
for i in range(n):
76+
for j in range(i):
77+
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
7678
```
7779

7880
### **Java**
@@ -83,19 +85,63 @@ class Solution:
8385
class Solution {
8486
public void rotate(int[][] matrix) {
8587
int n = matrix.length;
86-
for (int i = 0; i < n / 2; ++i) {
87-
for (int j = i; j < n - 1 - i; ++j) {
88+
for (int i = 0; i < n >> 1; ++i) {
89+
for (int j = 0; j < n; ++j) {
90+
int t = matrix[i][j];
91+
matrix[i][j] = matrix[n - i - 1][j];
92+
matrix[n - i - 1][j] = t;
93+
}
94+
}
95+
for (int i = 0; i < n; ++i) {
96+
for (int j = 0; j < i; ++j) {
8897
int t = matrix[i][j];
89-
matrix[i][j] = matrix[n - j - 1][i];
90-
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
91-
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
92-
matrix[j][n - i - 1] = t;
98+
matrix[i][j] = matrix[j][i];
99+
matrix[j][i] = t;
93100
}
94101
}
95102
}
96103
}
97104
```
98105

106+
### **C++**
107+
108+
```cpp
109+
class Solution {
110+
public:
111+
void rotate(vector<vector<int>>& matrix) {
112+
int n = matrix.size();
113+
for (int i = 0; i < n >> 1; ++i) {
114+
for (int j = 0; j < n; ++j) {
115+
swap(matrix[i][j], matrix[n - i - 1][j]);
116+
}
117+
}
118+
for (int i = 0; i < n; ++i) {
119+
for (int j = 0; j < i; ++j) {
120+
swap(matrix[i][j], matrix[j][i]);
121+
}
122+
}
123+
}
124+
};
125+
```
126+
127+
### **Go**
128+
129+
```go
130+
func rotate(matrix [][]int) {
131+
n := len(matrix)
132+
for i := 0; i < n>>1; i++ {
133+
for j := 0; j < n; j++ {
134+
matrix[i][j], matrix[n-i-1][j] = matrix[n-i-1][j], matrix[i][j]
135+
}
136+
}
137+
for i := 0; i < n; i++ {
138+
for j := 0; j < i; j++ {
139+
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
140+
}
141+
}
142+
}
143+
```
144+
99145
### **JavaScript**
100146

101147
```js
@@ -104,34 +150,78 @@ class Solution {
104150
* @return {void} Do not return anything, modify matrix in-place instead.
105151
*/
106152
var rotate = function (matrix) {
107-
const n = matrix.length;
108-
for (let i = 0; i < n / 2; i++) {
109-
for (let j = i; j < n - i - 1; j++) {
110-
let t = matrix[i][j];
111-
matrix[i][j] = matrix[n - j - 1][i];
112-
matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
113-
matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
114-
matrix[j][n - i - 1] = t;
153+
matrix.reverse();
154+
for (let i = 0; i < matrix.length; ++i) {
155+
for (let j = 0; j < i; ++j) {
156+
[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
115157
}
116158
}
117159
};
118160
```
119161

120-
### **Go**
162+
### **TypeScript**
121163

122-
```go
123-
func rotate(matrix [][]int) {
124-
n := len(matrix)
125-
r, c := n/2, (n+1)/2
126-
for i := 0; i < r; i++ {
127-
for j := 0; j < c; j++ {
128-
temp := matrix[i][j]
129-
matrix[i][j] = matrix[n-j-1][i]
130-
matrix[n-j-1][i] = matrix[n-i-1][n-j-1]
131-
matrix[n-i-1][n-j-1] = matrix[j][n-i-1]
132-
matrix[j][n-i-1] = temp
133-
}
134-
}
164+
```ts
165+
/**
166+
Do not return anything, modify matrix in-place instead.
167+
*/
168+
function rotate(matrix: number[][]): void {
169+
matrix.reverse();
170+
for (let i = 0; i < matrix.length; ++i) {
171+
for (let j = 0; j < i; ++j) {
172+
const t = matrix[i][j];
173+
matrix[i][j] = matrix[j][i];
174+
matrix[j][i] = t;
175+
}
176+
}
177+
}
178+
```
179+
180+
### **C#**
181+
182+
```cs
183+
public class Solution {
184+
public void Rotate(int[][] matrix) {
185+
int n = matrix.Length;
186+
for (int i = 0; i < n >> 1; ++i) {
187+
for (int j = 0; j < n; ++j) {
188+
int t = matrix[i][j];
189+
matrix[i][j] = matrix[n - i - 1][j];
190+
matrix[n - i - 1][j] = t;
191+
}
192+
}
193+
for (int i = 0; i < n; ++i) {
194+
for (int j = 0; j < i; ++j) {
195+
int t = matrix[i][j];
196+
matrix[i][j] = matrix[j][i];
197+
matrix[j][i] = t;
198+
}
199+
}
200+
}
201+
}
202+
```
203+
204+
### **Rust**
205+
206+
```rust
207+
impl Solution {
208+
pub fn rotate(matrix: &mut Vec<Vec<i32>>) {
209+
let n = matrix.len();
210+
for i in 0..n / 2 {
211+
for j in 0..n {
212+
let t = matrix[i][j];
213+
matrix[i][j] = matrix[n - i - 1][j];
214+
matrix[n - i - 1][j] = t;
215+
}
216+
}
217+
for i in 0..n {
218+
for j in 0..i {
219+
let t = matrix[i][j];
220+
matrix[i][j] = matrix[j][i];
221+
matrix[j][i] = t;
222+
}
223+
}
224+
}
135225
}
136226
```
137227

0 commit comments

Comments
 (0)