Skip to content

Commit 107746a

Browse files
committed
feat: update solutions to lc problem: No.1030
No.1030.Matrix Cells in Distance Order
1 parent 2c5e36c commit 107746a

File tree

6 files changed

+91
-83
lines changed

6 files changed

+91
-83
lines changed

solution/1000-1099/1030.Matrix Cells in Distance Order/README.md

+33-29
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@
5656

5757
**方法一:BFS**
5858

59-
从坐标点 `(rCenter, cCenter)` 往上下左右 4 个方向进行搜索,将搜索到的坐标点添加到结果列表 ans 中,并记录访问过的节点,防止重复搜索
59+
我们定义一个队列 $q$,初始时将坐标点 $(rCenter, cCenter)$ 入队,用一个二维布尔数组 $vis$ 记录已经访问过的点,初始时 $vis[rCenter][cCenter]$ 为 $true$
6060

61-
搜索结束,返回结果列表 ans 即可。
61+
接下来,我们不断地从队列中取出一个点,将其加入答案数组,然后将其上下左右四个相邻点加入队列,注意要判断这些点是否已经访问过,如果没有访问过,就将其标记为已访问,并将其加入队列。一直重复这个过程,直到队列为空,此时答案数组中的点就是按照距离从小到大的顺序排列的。
62+
63+
时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
6264

6365
<!-- tabs:start -->
6466

@@ -71,19 +73,19 @@ class Solution:
7173
def allCellsDistOrder(
7274
self, rows: int, cols: int, rCenter: int, cCenter: int
7375
) -> List[List[int]]:
74-
q = deque([(rCenter, cCenter)])
76+
q = deque([[rCenter, cCenter]])
7577
vis = [[False] * cols for _ in range(rows)]
7678
vis[rCenter][cCenter] = True
7779
ans = []
7880
while q:
7981
for _ in range(len(q)):
80-
i, j = q.popleft()
81-
ans.append([i, j])
82-
for a, b in [[1, 0], [-1, 0], [0, 1], [0, -1]]:
83-
x, y = i + a, j + b
82+
p = q.popleft()
83+
ans.append(p)
84+
for a, b in pairwise((-1, 0, 1, 0, -1)):
85+
x, y = p[0] + a, p[1] + b
8486
if 0 <= x < rows and 0 <= y < cols and not vis[x][y]:
85-
q.append((x, y))
8687
vis[x][y] = True
88+
q.append([x, y])
8789
return ans
8890
```
8991

@@ -92,25 +94,26 @@ class Solution:
9294
<!-- 这里可写当前语言的特殊实现逻辑 -->
9395

9496
```java
97+
import java.util.Deque;
98+
9599
class Solution {
96100
public int[][] allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
97101
Deque<int[]> q = new ArrayDeque<>();
98-
q.offer(new int[] {rCenter, cCenter});
102+
q.offer(new int[]{rCenter, cCenter});
99103
boolean[][] vis = new boolean[rows][cols];
100104
vis[rCenter][cCenter] = true;
101105
int[][] ans = new int[rows * cols][2];
102-
int idx = 0;
103106
int[] dirs = {-1, 0, 1, 0, -1};
107+
int idx = 0;
104108
while (!q.isEmpty()) {
105109
for (int n = q.size(); n > 0; --n) {
106-
int[] p = q.poll();
110+
var p = q.poll();
107111
ans[idx++] = p;
108112
for (int k = 0; k < 4; ++k) {
109-
int x = p[0] + dirs[k];
110-
int y = p[1] + dirs[k + 1];
113+
int x = p[0] + dirs[k], y = p[1] + dirs[k + 1];
111114
if (x >= 0 && x < rows && y >= 0 && y < cols && !vis[x][y]) {
112-
q.offer(new int[] {x, y});
113115
vis[x][y] = true;
116+
q.offer(new int[]{x, y});
114117
}
115118
}
116119
}
@@ -126,22 +129,24 @@ class Solution {
126129
class Solution {
127130
public:
128131
vector<vector<int>> allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
129-
queue<vector<int>> q;
130-
q.push({rCenter, cCenter});
131-
vector<vector<bool>> vis(rows, vector<bool>(cols));
132-
vis[rCenter][cCenter] = true;
132+
queue<pair<int, int>> q;
133+
q.emplace(rCenter, cCenter);
133134
vector<vector<int>> ans;
134-
vector<int> dirs = {-1, 0, 1, 0, -1};
135+
bool vis[rows][cols];
136+
memset(vis, false, sizeof(vis));
137+
vis[rCenter][cCenter] = true;
138+
int dirs[5] = {-1, 0, 1, 0, -1};
135139
while (!q.empty()) {
136-
for (int n = q.size(); n > 0; --n) {
137-
auto p = q.front();
140+
for (int n = q.size(); n; --n) {
141+
auto [i, j] = q.front();
138142
q.pop();
139-
ans.push_back(p);
143+
ans.push_back({i, j});
140144
for (int k = 0; k < 4; ++k) {
141-
int x = p[0] + dirs[k], y = p[1] + dirs[k + 1];
145+
int x = i + dirs[k];
146+
int y = j + dirs[k + 1];
142147
if (x >= 0 && x < rows && y >= 0 && y < cols && !vis[x][y]) {
143-
q.push({x, y});
144148
vis[x][y] = true;
149+
q.emplace(x, y);
145150
}
146151
}
147152
}
@@ -154,15 +159,14 @@ public:
154159
### **Go**
155160
156161
```go
157-
func allCellsDistOrder(rows int, cols int, rCenter int, cCenter int) [][]int {
162+
func allCellsDistOrder(rows int, cols int, rCenter int, cCenter int) (ans [][]int) {
158163
q := [][]int{{rCenter, cCenter}}
159164
vis := make([][]bool, rows)
160165
for i := range vis {
161166
vis[i] = make([]bool, cols)
162167
}
163168
vis[rCenter][cCenter] = true
164-
var ans [][]int
165-
dirs := []int{-1, 0, 1, 0, -1}
169+
dirs := [5]int{-1, 0, 1, 0, -1}
166170
for len(q) > 0 {
167171
for n := len(q); n > 0; n-- {
168172
p := q[0]
@@ -171,13 +175,13 @@ func allCellsDistOrder(rows int, cols int, rCenter int, cCenter int) [][]int {
171175
for k := 0; k < 4; k++ {
172176
x, y := p[0]+dirs[k], p[1]+dirs[k+1]
173177
if x >= 0 && x < rows && y >= 0 && y < cols && !vis[x][y] {
174-
q = append(q, []int{x, y})
175178
vis[x][y] = true
179+
q = append(q, []int{x, y})
176180
}
177181
}
178182
}
179183
}
180-
return ans
184+
return
181185
}
182186
```
183187

solution/1000-1099/1030.Matrix Cells in Distance Order/README_EN.md

+29-27
Original file line numberDiff line numberDiff line change
@@ -57,44 +57,45 @@ class Solution:
5757
def allCellsDistOrder(
5858
self, rows: int, cols: int, rCenter: int, cCenter: int
5959
) -> List[List[int]]:
60-
q = deque([(rCenter, cCenter)])
60+
q = deque([[rCenter, cCenter]])
6161
vis = [[False] * cols for _ in range(rows)]
6262
vis[rCenter][cCenter] = True
6363
ans = []
6464
while q:
6565
for _ in range(len(q)):
66-
i, j = q.popleft()
67-
ans.append([i, j])
68-
for a, b in [[1, 0], [-1, 0], [0, 1], [0, -1]]:
69-
x, y = i + a, j + b
66+
p = q.popleft()
67+
ans.append(p)
68+
for a, b in pairwise((-1, 0, 1, 0, -1)):
69+
x, y = p[0] + a, p[1] + b
7070
if 0 <= x < rows and 0 <= y < cols and not vis[x][y]:
71-
q.append((x, y))
7271
vis[x][y] = True
72+
q.append([x, y])
7373
return ans
7474
```
7575

7676
### **Java**
7777

7878
```java
79+
import java.util.Deque;
80+
7981
class Solution {
8082
public int[][] allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
8183
Deque<int[]> q = new ArrayDeque<>();
82-
q.offer(new int[] {rCenter, cCenter});
84+
q.offer(new int[]{rCenter, cCenter});
8385
boolean[][] vis = new boolean[rows][cols];
8486
vis[rCenter][cCenter] = true;
8587
int[][] ans = new int[rows * cols][2];
86-
int idx = 0;
8788
int[] dirs = {-1, 0, 1, 0, -1};
89+
int idx = 0;
8890
while (!q.isEmpty()) {
8991
for (int n = q.size(); n > 0; --n) {
90-
int[] p = q.poll();
92+
var p = q.poll();
9193
ans[idx++] = p;
9294
for (int k = 0; k < 4; ++k) {
93-
int x = p[0] + dirs[k];
94-
int y = p[1] + dirs[k + 1];
95+
int x = p[0] + dirs[k], y = p[1] + dirs[k + 1];
9596
if (x >= 0 && x < rows && y >= 0 && y < cols && !vis[x][y]) {
96-
q.offer(new int[] {x, y});
9797
vis[x][y] = true;
98+
q.offer(new int[]{x, y});
9899
}
99100
}
100101
}
@@ -110,22 +111,24 @@ class Solution {
110111
class Solution {
111112
public:
112113
vector<vector<int>> allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
113-
queue<vector<int>> q;
114-
q.push({rCenter, cCenter});
115-
vector<vector<bool>> vis(rows, vector<bool>(cols));
116-
vis[rCenter][cCenter] = true;
114+
queue<pair<int, int>> q;
115+
q.emplace(rCenter, cCenter);
117116
vector<vector<int>> ans;
118-
vector<int> dirs = {-1, 0, 1, 0, -1};
117+
bool vis[rows][cols];
118+
memset(vis, false, sizeof(vis));
119+
vis[rCenter][cCenter] = true;
120+
int dirs[5] = {-1, 0, 1, 0, -1};
119121
while (!q.empty()) {
120-
for (int n = q.size(); n > 0; --n) {
121-
auto p = q.front();
122+
for (int n = q.size(); n; --n) {
123+
auto [i, j] = q.front();
122124
q.pop();
123-
ans.push_back(p);
125+
ans.push_back({i, j});
124126
for (int k = 0; k < 4; ++k) {
125-
int x = p[0] + dirs[k], y = p[1] + dirs[k + 1];
127+
int x = i + dirs[k];
128+
int y = j + dirs[k + 1];
126129
if (x >= 0 && x < rows && y >= 0 && y < cols && !vis[x][y]) {
127-
q.push({x, y});
128130
vis[x][y] = true;
131+
q.emplace(x, y);
129132
}
130133
}
131134
}
@@ -138,15 +141,14 @@ public:
138141
### **Go**
139142
140143
```go
141-
func allCellsDistOrder(rows int, cols int, rCenter int, cCenter int) [][]int {
144+
func allCellsDistOrder(rows int, cols int, rCenter int, cCenter int) (ans [][]int) {
142145
q := [][]int{{rCenter, cCenter}}
143146
vis := make([][]bool, rows)
144147
for i := range vis {
145148
vis[i] = make([]bool, cols)
146149
}
147150
vis[rCenter][cCenter] = true
148-
var ans [][]int
149-
dirs := []int{-1, 0, 1, 0, -1}
151+
dirs := [5]int{-1, 0, 1, 0, -1}
150152
for len(q) > 0 {
151153
for n := len(q); n > 0; n-- {
152154
p := q[0]
@@ -155,13 +157,13 @@ func allCellsDistOrder(rows int, cols int, rCenter int, cCenter int) [][]int {
155157
for k := 0; k < 4; k++ {
156158
x, y := p[0]+dirs[k], p[1]+dirs[k+1]
157159
if x >= 0 && x < rows && y >= 0 && y < cols && !vis[x][y] {
158-
q = append(q, []int{x, y})
159160
vis[x][y] = true
161+
q = append(q, []int{x, y})
160162
}
161163
}
162164
}
163165
}
164-
return ans
166+
return
165167
}
166168
```
167169

solution/1000-1099/1030.Matrix Cells in Distance Order/Solution.cpp

+12-10
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
class Solution {
22
public:
33
vector<vector<int>> allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
4-
queue<vector<int>> q;
5-
q.push({rCenter, cCenter});
6-
vector<vector<bool>> vis(rows, vector<bool>(cols));
7-
vis[rCenter][cCenter] = true;
4+
queue<pair<int, int>> q;
5+
q.emplace(rCenter, cCenter);
86
vector<vector<int>> ans;
9-
vector<int> dirs = {-1, 0, 1, 0, -1};
7+
bool vis[rows][cols];
8+
memset(vis, false, sizeof(vis));
9+
vis[rCenter][cCenter] = true;
10+
int dirs[5] = {-1, 0, 1, 0, -1};
1011
while (!q.empty()) {
11-
for (int n = q.size(); n > 0; --n) {
12-
auto p = q.front();
12+
for (int n = q.size(); n; --n) {
13+
auto [i, j] = q.front();
1314
q.pop();
14-
ans.push_back(p);
15+
ans.push_back({i, j});
1516
for (int k = 0; k < 4; ++k) {
16-
int x = p[0] + dirs[k], y = p[1] + dirs[k + 1];
17+
int x = i + dirs[k];
18+
int y = j + dirs[k + 1];
1719
if (x >= 0 && x < rows && y >= 0 && y < cols && !vis[x][y]) {
18-
q.push({x, y});
1920
vis[x][y] = true;
21+
q.emplace(x, y);
2022
}
2123
}
2224
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
func allCellsDistOrder(rows int, cols int, rCenter int, cCenter int) [][]int {
1+
func allCellsDistOrder(rows int, cols int, rCenter int, cCenter int) (ans [][]int) {
22
q := [][]int{{rCenter, cCenter}}
33
vis := make([][]bool, rows)
44
for i := range vis {
55
vis[i] = make([]bool, cols)
66
}
77
vis[rCenter][cCenter] = true
8-
var ans [][]int
9-
dirs := []int{-1, 0, 1, 0, -1}
8+
dirs := [5]int{-1, 0, 1, 0, -1}
109
for len(q) > 0 {
1110
for n := len(q); n > 0; n-- {
1211
p := q[0]
@@ -15,11 +14,11 @@ func allCellsDistOrder(rows int, cols int, rCenter int, cCenter int) [][]int {
1514
for k := 0; k < 4; k++ {
1615
x, y := p[0]+dirs[k], p[1]+dirs[k+1]
1716
if x >= 0 && x < rows && y >= 0 && y < cols && !vis[x][y] {
18-
q = append(q, []int{x, y})
1917
vis[x][y] = true
18+
q = append(q, []int{x, y})
2019
}
2120
}
2221
}
2322
}
24-
return ans
23+
return
2524
}

solution/1000-1099/1030.Matrix Cells in Distance Order/Solution.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1+
import java.util.Deque;
2+
13
class Solution {
24
public int[][] allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
35
Deque<int[]> q = new ArrayDeque<>();
4-
q.offer(new int[] {rCenter, cCenter});
6+
q.offer(new int[]{rCenter, cCenter});
57
boolean[][] vis = new boolean[rows][cols];
68
vis[rCenter][cCenter] = true;
79
int[][] ans = new int[rows * cols][2];
8-
int idx = 0;
910
int[] dirs = {-1, 0, 1, 0, -1};
11+
int idx = 0;
1012
while (!q.isEmpty()) {
1113
for (int n = q.size(); n > 0; --n) {
12-
int[] p = q.poll();
14+
var p = q.poll();
1315
ans[idx++] = p;
1416
for (int k = 0; k < 4; ++k) {
15-
int x = p[0] + dirs[k];
16-
int y = p[1] + dirs[k + 1];
17+
int x = p[0] + dirs[k], y = p[1] + dirs[k + 1];
1718
if (x >= 0 && x < rows && y >= 0 && y < cols && !vis[x][y]) {
18-
q.offer(new int[] {x, y});
1919
vis[x][y] = true;
20+
q.offer(new int[]{x, y});
2021
}
2122
}
2223
}

solution/1000-1099/1030.Matrix Cells in Distance Order/Solution.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ class Solution:
22
def allCellsDistOrder(
33
self, rows: int, cols: int, rCenter: int, cCenter: int
44
) -> List[List[int]]:
5-
q = deque([(rCenter, cCenter)])
5+
q = deque([[rCenter, cCenter]])
66
vis = [[False] * cols for _ in range(rows)]
77
vis[rCenter][cCenter] = True
88
ans = []
99
while q:
1010
for _ in range(len(q)):
11-
i, j = q.popleft()
12-
ans.append([i, j])
13-
for a, b in [[1, 0], [-1, 0], [0, 1], [0, -1]]:
14-
x, y = i + a, j + b
11+
p = q.popleft()
12+
ans.append(p)
13+
for a, b in pairwise((-1, 0, 1, 0, -1)):
14+
x, y = p[0] + a, p[1] + b
1515
if 0 <= x < rows and 0 <= y < cols and not vis[x][y]:
16-
q.append((x, y))
1716
vis[x][y] = True
17+
q.append([x, y])
1818
return ans

0 commit comments

Comments
 (0)