Skip to content

Commit 323dfb9

Browse files
committed
feat: add python and java solutions to leetcode problem: No.0054
See https://leetcode-cn.com/problems/spiral-matrix/
1 parent 409d4c3 commit 323dfb9

File tree

9 files changed

+248
-168
lines changed

9 files changed

+248
-168
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252

5353
1. [数组中重复的数字](/lcof/面试题03.%20数组中重复的数字/README.md)
5454
1. [旋转数组](/solution/0100-0199/0189.Rotate%20Array/README.md)
55+
1. [螺旋矩阵](/solution/0000-0099/0054.Spiral%20Matrix/README.md)
5556
1. [三数之和](/solution/0000-0099/0015.3Sum/README.md)
5657
1. [四数之和](/solution/0000-0099/0018.4Sum/README.md)
5758
1. [合并两个有序数组](/solution/0000-0099/0088.Merge%20Sorted%20Array/README.md)

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ Complete solutions to [LeetCode](https://leetcode-cn.com/problemset/all/), [LCOF
5151
### Arrays
5252

5353
1. [Rotate Array](/solution/0100-0199/0189.Rotate%20Array/README_EN.md)
54+
1. [Spiral Matrix](/solution/0000-0099/0054.Spiral%20Matrix/README_EN.md)
5455
1. [3Sum](/solution/0000-0099/0015.3Sum/README_EN.md)
5556
1. [4Sum](/solution/0000-0099/0018.4Sum/README_EN.md)
5657
1. [Merge Sorted Array](/solution/0000-0099/0088.Merge%20Sorted%20Array/README_EN.md)

lcof/面试题29. 顺时针打印矩阵/README.md

+39-41
Original file line numberDiff line numberDiff line change
@@ -25,79 +25,77 @@
2525

2626
## 解法
2727

28+
从外往里一圈一圈遍历并存储矩阵元素即可。
29+
2830
<!-- tabs:start -->
2931

3032
### **Python3**
3133

3234
```python
3335
class Solution:
3436
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
35-
if len(matrix) == 0:
37+
def add(i1, j1, i2, j2):
38+
if i1 == i2:
39+
return [matrix[i1][j] for j in range(j1, j2 + 1)]
40+
if j1 == j2:
41+
return [matrix[i][j1] for i in range(i1, i2 + 1)]
42+
return [matrix[i1][j] for j in range(j1, j2)] + [matrix[i][j2] for i in range(i1, i2)] + [matrix[i2][j] for j in range(j2, j1, -1)] + [matrix[i][j1] for i in range(i2, i1, -1)]
43+
if not matrix or not matrix[0]:
3644
return []
37-
38-
s1, e1, s2, e2 = 0, 0, len(matrix) - 1, len(matrix[0]) - 1
45+
m, n = len(matrix), len(matrix[0])
46+
i1, j1, i2, j2 = 0, 0, m - 1, n - 1
3947
res = []
40-
while s1 <= s2 and e1 <= e2:
41-
res += self._spiral_add(matrix, s1, e1, s2, e2)
42-
s1, e1, s2, e2 = s1 + 1, e1 + 1, s2 - 1, e2 - 1
48+
while i1 <= i2 and j1 <= j2:
49+
res += add(i1, j1, i2, j2)
50+
i1, j1, i2, j2 = i1 + 1, j1 + 1, i2 - 1, j2 - 1
4351
return res
44-
45-
def _spiral_add(self, matrix, s1, e1, s2, e2) -> List[int]:
46-
if s1 == s2:
47-
return [matrix[s1][j] for j in range(e1, e2 + 1)]
48-
if e1 == e2:
49-
return [matrix[i][e1] for i in range(s1, s2 + 1)]
50-
return [matrix[s1][j] for j in range(e1, e2)] + \
51-
[matrix[i][e2] for i in range(s1, s2)] + \
52-
[matrix[s2][j] for j in range(e2, e1, -1)] + \
53-
[matrix[i][e1] for i in range(s2, s1, -1)]
54-
5552
```
5653

5754
### **Java**
5855

5956
```java
6057
class Solution {
58+
private int[] res;
6159
private int index;
60+
6261
public int[] spiralOrder(int[][] matrix) {
63-
if (matrix.length == 0) {
64-
return new int[0];
65-
}
62+
int m, n;
63+
if (matrix == null || (m = matrix.length) == 0 || matrix[0] == null || (n = matrix[0].length) == 0)
64+
return new int[]{};
65+
res = new int[m * n];
6666
index = 0;
67-
int m = matrix.length, n = matrix[0].length;
68-
int s1 = 0, e1 = 0, s2 = m - 1, e2 = n - 1;
69-
int[] res = new int[m * n];
70-
while (s1 <= s2 && e1 <= e2) {
71-
spiralAdd(matrix, s1++, e1++, s2--, e2--, res);
67+
int i1 = 0, i2 = m - 1;
68+
int j1 = 0, j2 = n - 1;
69+
while (i1 <= i2 && j1 <= j2) {
70+
add(matrix, i1++, j1++, i2--, j2--);
7271
}
7372
return res;
7473
}
7574

76-
public void spiralAdd(int[][] matrix, int s1, int e1, int s2, int e2, int[] res) {
77-
if (s1 == s2) {
78-
for (int j = e1; j <= e2; ++j) {
79-
res[index++] = matrix[s1][j];
75+
private void add(int[][] matrix, int i1, int j1, int i2, int j2) {
76+
if (i1 == i2) {
77+
for (int j = j1; j <= j2; ++j) {
78+
res[index++] = matrix[i1][j];
8079
}
8180
return;
8281
}
83-
if (e1 == e2) {
84-
for (int i = s1; i <= s2; ++i) {
85-
res[index++] = matrix[i][e1];
82+
if (j1 == j2) {
83+
for (int i = i1; i <= i2; ++i) {
84+
res[index++] = matrix[i][j1];
8685
}
8786
return;
8887
}
89-
90-
for (int j = e1; j < e2; ++j) {
91-
res[index++] = matrix[s1][j];
88+
for (int j = j1; j < j2; ++j) {
89+
res[index++] = matrix[i1][j];
9290
}
93-
for (int i = s1; i < s2; ++i) {
94-
res[index++] = matrix[i][e2];
91+
for (int i = i1; i < i2; ++i) {
92+
res[index++] = matrix[i][j2];
9593
}
96-
for (int j = e2; j > e1; --j) {
97-
res[index++] = matrix[s2][j];
94+
for (int j = j2; j > j1; --j) {
95+
res[index++] = matrix[i2][j];
9896
}
99-
for (int i = s2; i > s1; --i) {
100-
res[index++] = matrix[i][e1];
97+
for (int i = i2; i > i1; --i) {
98+
res[index++] = matrix[i][j1];
10199
}
102100
}
103101
}
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,45 @@
11
class Solution {
2+
private int[] res;
23
private int index;
34

45
public int[] spiralOrder(int[][] matrix) {
5-
if (matrix.length == 0) {
6-
return new int[0];
7-
}
6+
int m, n;
7+
if (matrix == null || (m = matrix.length) == 0 || matrix[0] == null || (n = matrix[0].length) == 0)
8+
return new int[]{};
9+
res = new int[m * n];
810
index = 0;
9-
int m = matrix.length, n = matrix[0].length;
10-
int s1 = 0, e1 = 0, s2 = m - 1, e2 = n - 1;
11-
int[] res = new int[m * n];
12-
while (s1 <= s2 && e1 <= e2) {
13-
spiralAdd(matrix, s1++, e1++, s2--, e2--, res);
11+
int i1 = 0, i2 = m - 1;
12+
int j1 = 0, j2 = n - 1;
13+
while (i1 <= i2 && j1 <= j2) {
14+
add(matrix, i1++, j1++, i2--, j2--);
1415
}
1516
return res;
1617
}
1718

18-
public void spiralAdd(int[][] matrix, int s1, int e1, int s2, int e2, int[] res) {
19-
if (s1 == s2) {
20-
for (int j = e1; j <= e2; ++j) {
21-
res[index++] = matrix[s1][j];
19+
private void add(int[][] matrix, int i1, int j1, int i2, int j2) {
20+
if (i1 == i2) {
21+
for (int j = j1; j <= j2; ++j) {
22+
res[index++] = matrix[i1][j];
2223
}
2324
return;
2425
}
25-
if (e1 == e2) {
26-
for (int i = s1; i <= s2; ++i) {
27-
res[index++] = matrix[i][e1];
26+
if (j1 == j2) {
27+
for (int i = i1; i <= i2; ++i) {
28+
res[index++] = matrix[i][j1];
2829
}
2930
return;
3031
}
31-
32-
for (int j = e1; j < e2; ++j) {
33-
res[index++] = matrix[s1][j];
32+
for (int j = j1; j < j2; ++j) {
33+
res[index++] = matrix[i1][j];
3434
}
35-
for (int i = s1; i < s2; ++i) {
36-
res[index++] = matrix[i][e2];
35+
for (int i = i1; i < i2; ++i) {
36+
res[index++] = matrix[i][j2];
3737
}
38-
for (int j = e2; j > e1; --j) {
39-
res[index++] = matrix[s2][j];
38+
for (int j = j2; j > j1; --j) {
39+
res[index++] = matrix[i2][j];
4040
}
41-
for (int i = s2; i > s1; --i) {
42-
res[index++] = matrix[i][e1];
41+
for (int i = i2; i > i1; --i) {
42+
res[index++] = matrix[i][j1];
4343
}
4444
}
4545
}
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,17 @@
11
class Solution:
22
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
3-
if len(matrix) == 0:
3+
def add(i1, j1, i2, j2):
4+
if i1 == i2:
5+
return [matrix[i1][j] for j in range(j1, j2 + 1)]
6+
if j1 == j2:
7+
return [matrix[i][j1] for i in range(i1, i2 + 1)]
8+
return [matrix[i1][j] for j in range(j1, j2)] + [matrix[i][j2] for i in range(i1, i2)] + [matrix[i2][j] for j in range(j2, j1, -1)] + [matrix[i][j1] for i in range(i2, i1, -1)]
9+
if not matrix or not matrix[0]:
410
return []
5-
6-
s1, e1, s2, e2 = 0, 0, len(matrix) - 1, len(matrix[0]) - 1
11+
m, n = len(matrix), len(matrix[0])
12+
i1, j1, i2, j2 = 0, 0, m - 1, n - 1
713
res = []
8-
while s1 <= s2 and e1 <= e2:
9-
res += self._spiral_add(matrix, s1, e1, s2, e2)
10-
s1, e1, s2, e2 = s1 + 1, e1 + 1, s2 - 1, e2 - 1
14+
while i1 <= i2 and j1 <= j2:
15+
res += add(i1, j1, i2, j2)
16+
i1, j1, i2, j2 = i1 + 1, j1 + 1, i2 - 1, j2 - 1
1117
return res
12-
13-
def _spiral_add(self, matrix, s1, e1, s2, e2) -> List[int]:
14-
if s1 == s2:
15-
return [matrix[s1][j] for j in range(e1, e2 + 1)]
16-
if e1 == e2:
17-
return [matrix[i][e1] for i in range(s1, s2 + 1)]
18-
return [matrix[s1][j] for j in range(e1, e2)] + \
19-
[matrix[i][e2] for i in range(s1, s2)] + \
20-
[matrix[s2][j] for j in range(e2, e1, -1)] + \
21-
[matrix[i][e1] for i in range(s2, s1, -1)]

solution/0000-0099/0054.Spiral Matrix/README.md

+62-2
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,82 @@
3333

3434
<!-- 这里可写通用的实现逻辑 -->
3535

36+
从外往里一圈一圈遍历并存储矩阵元素即可。
37+
3638
<!-- tabs:start -->
3739

3840
### **Python3**
3941

4042
<!-- 这里可写当前语言的特殊实现逻辑 -->
4143

4244
```python
43-
45+
class Solution:
46+
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
47+
def add(i1, j1, i2, j2):
48+
if i1 == i2:
49+
return [matrix[i1][j] for j in range(j1, j2 + 1)]
50+
if j1 == j2:
51+
return [matrix[i][j1] for i in range(i1, i2 + 1)]
52+
return [matrix[i1][j] for j in range(j1, j2)] + [matrix[i][j2] for i in range(i1, i2)] + [matrix[i2][j] for j in range(j2, j1, -1)] + [matrix[i][j1] for i in range(i2, i1, -1)]
53+
if not matrix or not matrix[0]:
54+
return []
55+
m, n = len(matrix), len(matrix[0])
56+
i1, j1, i2, j2 = 0, 0, m - 1, n - 1
57+
res = []
58+
while i1 <= i2 and j1 <= j2:
59+
res += add(i1, j1, i2, j2)
60+
i1, j1, i2, j2 = i1 + 1, j1 + 1, i2 - 1, j2 - 1
61+
return res
4462
```
4563

4664
### **Java**
4765

4866
<!-- 这里可写当前语言的特殊实现逻辑 -->
4967

5068
```java
51-
69+
class Solution {
70+
private List<Integer> res;
71+
72+
public List<Integer> spiralOrder(int[][] matrix) {
73+
int m, n;
74+
if (matrix == null || (m = matrix.length) == 0 || matrix[0] == null || (n = matrix[0].length) == 0)
75+
return Collections.emptyList();
76+
res = new ArrayList<>();
77+
int i1 = 0, i2 = m - 1;
78+
int j1 = 0, j2 = n - 1;
79+
while (i1 <= i2 && j1 <= j2) {
80+
add(matrix, i1++, j1++, i2--, j2--);
81+
}
82+
return res;
83+
}
84+
85+
private void add(int[][] matrix, int i1, int j1, int i2, int j2) {
86+
if (i1 == i2) {
87+
for (int j = j1; j <= j2; ++j) {
88+
res.add(matrix[i1][j]);
89+
}
90+
return;
91+
}
92+
if (j1 == j2) {
93+
for (int i = i1; i <= i2; ++i) {
94+
res.add(matrix[i][j1]);
95+
}
96+
return;
97+
}
98+
for (int j = j1; j < j2; ++j) {
99+
res.add(matrix[i1][j]);
100+
}
101+
for (int i = i1; i < i2; ++i) {
102+
res.add(matrix[i][j2]);
103+
}
104+
for (int j = j2; j > j1; --j) {
105+
res.add(matrix[i2][j]);
106+
}
107+
for (int i = i2; i > i1; --i) {
108+
res.add(matrix[i][j1]);
109+
}
110+
}
111+
}
52112
```
53113

54114
### **...**

solution/0000-0099/0054.Spiral Matrix/README_EN.md

+60-2
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,71 @@
5353
### **Python3**
5454

5555
```python
56-
56+
class Solution:
57+
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
58+
def add(i1, j1, i2, j2):
59+
if i1 == i2:
60+
return [matrix[i1][j] for j in range(j1, j2 + 1)]
61+
if j1 == j2:
62+
return [matrix[i][j1] for i in range(i1, i2 + 1)]
63+
return [matrix[i1][j] for j in range(j1, j2)] + [matrix[i][j2] for i in range(i1, i2)] + [matrix[i2][j] for j in range(j2, j1, -1)] + [matrix[i][j1] for i in range(i2, i1, -1)]
64+
if not matrix or not matrix[0]:
65+
return []
66+
m, n = len(matrix), len(matrix[0])
67+
i1, j1, i2, j2 = 0, 0, m - 1, n - 1
68+
res = []
69+
while i1 <= i2 and j1 <= j2:
70+
res += add(i1, j1, i2, j2)
71+
i1, j1, i2, j2 = i1 + 1, j1 + 1, i2 - 1, j2 - 1
72+
return res
5773
```
5874

5975
### **Java**
6076

6177
```java
62-
78+
class Solution {
79+
private List<Integer> res;
80+
81+
public List<Integer> spiralOrder(int[][] matrix) {
82+
int m, n;
83+
if (matrix == null || (m = matrix.length) == 0 || matrix[0] == null || (n = matrix[0].length) == 0)
84+
return Collections.emptyList();
85+
res = new ArrayList<>();
86+
int i1 = 0, i2 = m - 1;
87+
int j1 = 0, j2 = n - 1;
88+
while (i1 <= i2 && j1 <= j2) {
89+
add(matrix, i1++, j1++, i2--, j2--);
90+
}
91+
return res;
92+
}
93+
94+
private void add(int[][] matrix, int i1, int j1, int i2, int j2) {
95+
if (i1 == i2) {
96+
for (int j = j1; j <= j2; ++j) {
97+
res.add(matrix[i1][j]);
98+
}
99+
return;
100+
}
101+
if (j1 == j2) {
102+
for (int i = i1; i <= i2; ++i) {
103+
res.add(matrix[i][j1]);
104+
}
105+
return;
106+
}
107+
for (int j = j1; j < j2; ++j) {
108+
res.add(matrix[i1][j]);
109+
}
110+
for (int i = i1; i < i2; ++i) {
111+
res.add(matrix[i][j2]);
112+
}
113+
for (int j = j2; j > j1; --j) {
114+
res.add(matrix[i2][j]);
115+
}
116+
for (int i = i2; i > i1; --i) {
117+
res.add(matrix[i][j1]);
118+
}
119+
}
120+
}
63121
```
64122

65123
### **...**

0 commit comments

Comments
 (0)