Skip to content

Commit 7564de7

Browse files
committed
feat: add solutions to lc problem: No.0885
No.0885.Spiral Matrix III
1 parent 73fbb45 commit 7564de7

File tree

6 files changed

+297
-2
lines changed

6 files changed

+297
-2
lines changed

solution/0800-0899/0885.Spiral Matrix III/README.md

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,116 @@
6060
<!-- 这里可写当前语言的特殊实现逻辑 -->
6161

6262
```python
63-
63+
class Solution:
64+
def spiralMatrixIII(self, rows: int, cols: int, rStart: int, cStart: int) -> List[List[int]]:
65+
ans = [[rStart, cStart]]
66+
if rows * cols == 1:
67+
return ans
68+
k = 1
69+
while True:
70+
for dr, dc, dk in [[0, 1, k], [1, 0, k], [0, -1, k + 1], [-1, 0, k + 1]]:
71+
for _ in range(dk):
72+
rStart += dr
73+
cStart += dc
74+
if 0 <= rStart < rows and 0 <= cStart < cols:
75+
ans.append([rStart, cStart])
76+
if len(ans) == rows * cols:
77+
return ans
78+
k += 2
6479
```
6580

6681
### **Java**
6782

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

7085
```java
86+
class Solution {
87+
public int[][] spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
88+
int cnt = rows * cols;
89+
int[][] ans = new int[cnt][2];
90+
ans[0] = new int[]{rStart, cStart};
91+
if (cnt == 1) {
92+
return ans;
93+
}
94+
for (int k = 1, idx = 1;; k += 2) {
95+
int[][] dirs = new int[][]{{0, 1, k}, {1, 0, k}, {0, -1, k + 1}, {-1, 0, k + 1}};
96+
for (int[] dir : dirs) {
97+
int r = dir[0], c = dir[1], dk = dir[2];
98+
while (dk-- > 0) {
99+
rStart += r;
100+
cStart += c;
101+
if (rStart >= 0 && rStart < rows && cStart >= 0 && cStart < cols) {
102+
ans[idx++] = new int[]{rStart, cStart};
103+
if (idx == cnt) {
104+
return ans;
105+
}
106+
}
107+
}
108+
}
109+
}
110+
}
111+
}
112+
```
113+
114+
### **C++**
115+
116+
```cpp
117+
class Solution {
118+
public:
119+
vector<vector<int>> spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
120+
int cnt = rows * cols;
121+
vector<vector<int>> ans;
122+
ans.push_back({rStart, cStart});
123+
if (cnt == 1) return ans;
124+
for (int k = 1;; k += 2)
125+
{
126+
vector<vector<int>> dirs = {{0, 1, k}, {1, 0, k}, {0, -1, k + 1}, {-1, 0, k + 1}};
127+
for (auto& dir : dirs)
128+
{
129+
int r = dir[0], c = dir[1], dk = dir[2];
130+
while (dk-- > 0)
131+
{
132+
rStart += r;
133+
cStart += c;
134+
if (rStart >= 0 && rStart < rows && cStart >= 0 && cStart < cols)
135+
{
136+
ans.push_back({rStart, cStart});
137+
if (ans.size() == cnt) return ans;
138+
}
139+
}
140+
}
141+
}
142+
}
143+
};
144+
```
71145
146+
### **Go**
147+
148+
```go
149+
func spiralMatrixIII(rows int, cols int, rStart int, cStart int) [][]int {
150+
cnt := rows * cols
151+
ans := [][]int{[]int{rStart, cStart}}
152+
if cnt == 1 {
153+
return ans
154+
}
155+
for k := 1; ; k += 2 {
156+
dirs := [][]int{{0, 1, k}, {1, 0, k}, {0, -1, k + 1}, {-1, 0, k + 1}}
157+
for _, dir := range dirs {
158+
r, c, dk := dir[0], dir[1], dir[2]
159+
for dk > 0 {
160+
rStart += r
161+
cStart += c
162+
if rStart >= 0 && rStart < rows && cStart >= 0 && cStart < cols {
163+
ans = append(ans, []int{rStart, cStart})
164+
if len(ans) == cnt {
165+
return ans
166+
}
167+
}
168+
dk--
169+
}
170+
}
171+
}
172+
}
72173
```
73174

74175
### **...**

solution/0800-0899/0885.Spiral Matrix III/README_EN.md

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,114 @@
4141
### **Python3**
4242

4343
```python
44-
44+
class Solution:
45+
def spiralMatrixIII(self, rows: int, cols: int, rStart: int, cStart: int) -> List[List[int]]:
46+
ans = [[rStart, cStart]]
47+
if rows * cols == 1:
48+
return ans
49+
k = 1
50+
while True:
51+
for dr, dc, dk in [[0, 1, k], [1, 0, k], [0, -1, k + 1], [-1, 0, k + 1]]:
52+
for _ in range(dk):
53+
rStart += dr
54+
cStart += dc
55+
if 0 <= rStart < rows and 0 <= cStart < cols:
56+
ans.append([rStart, cStart])
57+
if len(ans) == rows * cols:
58+
return ans
59+
k += 2
4560
```
4661

4762
### **Java**
4863

4964
```java
65+
class Solution {
66+
public int[][] spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
67+
int cnt = rows * cols;
68+
int[][] ans = new int[cnt][2];
69+
ans[0] = new int[]{rStart, cStart};
70+
if (cnt == 1) {
71+
return ans;
72+
}
73+
for (int k = 1, idx = 1;; k += 2) {
74+
int[][] dirs = new int[][]{{0, 1, k}, {1, 0, k}, {0, -1, k + 1}, {-1, 0, k + 1}};
75+
for (int[] dir : dirs) {
76+
int r = dir[0], c = dir[1], dk = dir[2];
77+
while (dk-- > 0) {
78+
rStart += r;
79+
cStart += c;
80+
if (rStart >= 0 && rStart < rows && cStart >= 0 && cStart < cols) {
81+
ans[idx++] = new int[]{rStart, cStart};
82+
if (idx == cnt) {
83+
return ans;
84+
}
85+
}
86+
}
87+
}
88+
}
89+
}
90+
}
91+
```
92+
93+
### **C++**
94+
95+
```cpp
96+
class Solution {
97+
public:
98+
vector<vector<int>> spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
99+
int cnt = rows * cols;
100+
vector<vector<int>> ans;
101+
ans.push_back({rStart, cStart});
102+
if (cnt == 1) return ans;
103+
for (int k = 1;; k += 2)
104+
{
105+
vector<vector<int>> dirs = {{0, 1, k}, {1, 0, k}, {0, -1, k + 1}, {-1, 0, k + 1}};
106+
for (auto& dir : dirs)
107+
{
108+
int r = dir[0], c = dir[1], dk = dir[2];
109+
while (dk-- > 0)
110+
{
111+
rStart += r;
112+
cStart += c;
113+
if (rStart >= 0 && rStart < rows && cStart >= 0 && cStart < cols)
114+
{
115+
ans.push_back({rStart, cStart});
116+
if (ans.size() == cnt) return ans;
117+
}
118+
}
119+
}
120+
}
121+
}
122+
};
123+
```
50124
125+
### **Go**
126+
127+
```go
128+
func spiralMatrixIII(rows int, cols int, rStart int, cStart int) [][]int {
129+
cnt := rows * cols
130+
ans := [][]int{[]int{rStart, cStart}}
131+
if cnt == 1 {
132+
return ans
133+
}
134+
for k := 1; ; k += 2 {
135+
dirs := [][]int{{0, 1, k}, {1, 0, k}, {0, -1, k + 1}, {-1, 0, k + 1}}
136+
for _, dir := range dirs {
137+
r, c, dk := dir[0], dir[1], dir[2]
138+
for dk > 0 {
139+
rStart += r
140+
cStart += c
141+
if rStart >= 0 && rStart < rows && cStart >= 0 && cStart < cols {
142+
ans = append(ans, []int{rStart, cStart})
143+
if len(ans) == cnt {
144+
return ans
145+
}
146+
}
147+
dk--
148+
}
149+
}
150+
}
151+
}
51152
```
52153

53154
### **...**
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
vector<vector<int>> spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
4+
int cnt = rows * cols;
5+
vector<vector<int>> ans;
6+
ans.push_back({rStart, cStart});
7+
if (cnt == 1) return ans;
8+
for (int k = 1;; k += 2)
9+
{
10+
vector<vector<int>> dirs = {{0, 1, k}, {1, 0, k}, {0, -1, k + 1}, {-1, 0, k + 1}};
11+
for (auto& dir : dirs)
12+
{
13+
int r = dir[0], c = dir[1], dk = dir[2];
14+
while (dk-- > 0)
15+
{
16+
rStart += r;
17+
cStart += c;
18+
if (rStart >= 0 && rStart < rows && cStart >= 0 && cStart < cols)
19+
{
20+
ans.push_back({rStart, cStart});
21+
if (ans.size() == cnt) return ans;
22+
}
23+
}
24+
}
25+
}
26+
}
27+
};
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
func spiralMatrixIII(rows int, cols int, rStart int, cStart int) [][]int {
2+
cnt := rows * cols
3+
ans := [][]int{[]int{rStart, cStart}}
4+
if cnt == 1 {
5+
return ans
6+
}
7+
for k := 1; ; k += 2 {
8+
dirs := [][]int{{0, 1, k}, {1, 0, k}, {0, -1, k + 1}, {-1, 0, k + 1}}
9+
for _, dir := range dirs {
10+
r, c, dk := dir[0], dir[1], dir[2]
11+
for dk > 0 {
12+
rStart += r
13+
cStart += c
14+
if rStart >= 0 && rStart < rows && cStart >= 0 && cStart < cols {
15+
ans = append(ans, []int{rStart, cStart})
16+
if len(ans) == cnt {
17+
return ans
18+
}
19+
}
20+
dk--
21+
}
22+
}
23+
}
24+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
public int[][] spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
3+
int cnt = rows * cols;
4+
int[][] ans = new int[cnt][2];
5+
ans[0] = new int[]{rStart, cStart};
6+
if (cnt == 1) {
7+
return ans;
8+
}
9+
for (int k = 1, idx = 1;; k += 2) {
10+
int[][] dirs = new int[][]{{0, 1, k}, {1, 0, k}, {0, -1, k + 1}, {-1, 0, k + 1}};
11+
for (int[] dir : dirs) {
12+
int r = dir[0], c = dir[1], dk = dir[2];
13+
while (dk-- > 0) {
14+
rStart += r;
15+
cStart += c;
16+
if (rStart >= 0 && rStart < rows && cStart >= 0 && cStart < cols) {
17+
ans[idx++] = new int[]{rStart, cStart};
18+
if (idx == cnt) {
19+
return ans;
20+
}
21+
}
22+
}
23+
}
24+
}
25+
}
26+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def spiralMatrixIII(self, rows: int, cols: int, rStart: int, cStart: int) -> List[List[int]]:
3+
ans = [[rStart, cStart]]
4+
if rows * cols == 1:
5+
return ans
6+
k = 1
7+
while True:
8+
for dr, dc, dk in [[0, 1, k], [1, 0, k], [0, -1, k + 1], [-1, 0, k + 1]]:
9+
for _ in range(dk):
10+
rStart += dr
11+
cStart += dc
12+
if 0 <= rStart < rows and 0 <= cStart < cols:
13+
ans.append([rStart, cStart])
14+
if len(ans) == rows * cols:
15+
return ans
16+
k += 2

0 commit comments

Comments
 (0)