56
56
57
57
** 方法一:BFS**
58
58
59
- 从坐标点 ` (rCenter, cCenter) ` 往上下左右 4 个方向进行搜索,将搜索到的坐标点添加到结果列表 ans 中,并记录访问过的节点,防止重复搜索 。
59
+ 我们定义一个队列 $q$,初始时将坐标点 $ (rCenter, cCenter)$ 入队,用一个二维布尔数组 $vis$ 记录已经访问过的点,初始时 $vis [ rCenter ] [ cCenter ] $ 为 $true$ 。
60
60
61
- 搜索结束,返回结果列表 ans 即可。
61
+ 接下来,我们不断地从队列中取出一个点,将其加入答案数组,然后将其上下左右四个相邻点加入队列,注意要判断这些点是否已经访问过,如果没有访问过,就将其标记为已访问,并将其加入队列。一直重复这个过程,直到队列为空,此时答案数组中的点就是按照距离从小到大的顺序排列的。
62
+
63
+ 时间复杂度 $O(m \times n)$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。
62
64
63
65
<!-- tabs:start -->
64
66
@@ -71,19 +73,19 @@ class Solution:
71
73
def allCellsDistOrder (
72
74
self , rows : int , cols : int , rCenter : int , cCenter : int
73
75
) -> List[List[int ]]:
74
- q = deque([( rCenter, cCenter) ])
76
+ q = deque([[ rCenter, cCenter] ])
75
77
vis = [[False ] * cols for _ in range (rows)]
76
78
vis[rCenter][cCenter] = True
77
79
ans = []
78
80
while q:
79
81
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
84
86
if 0 <= x < rows and 0 <= y < cols and not vis[x][y]:
85
- q.append((x, y))
86
87
vis[x][y] = True
88
+ q.append([x, y])
87
89
return ans
88
90
```
89
91
@@ -92,25 +94,26 @@ class Solution:
92
94
<!-- 这里可写当前语言的特殊实现逻辑 -->
93
95
94
96
``` java
97
+ import java.util.Deque ;
98
+
95
99
class Solution {
96
100
public int [][] allCellsDistOrder (int rows , int cols , int rCenter , int cCenter ) {
97
101
Deque<int[]> q = new ArrayDeque<> ();
98
- q. offer(new int [] {rCenter, cCenter});
102
+ q. offer(new int []{rCenter, cCenter});
99
103
boolean [][] vis = new boolean [rows][cols];
100
104
vis[rCenter][cCenter] = true ;
101
105
int [][] ans = new int [rows * cols][2 ];
102
- int idx = 0 ;
103
106
int [] dirs = {- 1 , 0 , 1 , 0 , - 1 };
107
+ int idx = 0 ;
104
108
while (! q. isEmpty()) {
105
109
for (int n = q. size(); n > 0 ; -- n) {
106
- int [] p = q. poll();
110
+ var p = q. poll();
107
111
ans[idx++ ] = p;
108
112
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 ];
111
114
if (x >= 0 && x < rows && y >= 0 && y < cols && ! vis[x][y]) {
112
- q. offer(new int [] {x, y});
113
115
vis[x][y] = true ;
116
+ q. offer(new int []{x, y});
114
117
}
115
118
}
116
119
}
@@ -126,22 +129,24 @@ class Solution {
126
129
class Solution {
127
130
public:
128
131
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);
133
134
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};
135
139
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();
138
142
q.pop();
139
- ans.push_back(p );
143
+ ans.push_back({i, j} );
140
144
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] ;
142
147
if (x >= 0 && x < rows && y >= 0 && y < cols && !vis[ x] [ y ] ) {
143
- q.push({x, y});
144
148
vis[ x] [ y ] = true;
149
+ q.emplace(x, y);
145
150
}
146
151
}
147
152
}
@@ -154,15 +159,14 @@ public:
154
159
### **Go**
155
160
156
161
```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) {
158
163
q := [][]int{{rCenter, cCenter}}
159
164
vis := make([][]bool, rows)
160
165
for i := range vis {
161
166
vis[i] = make([]bool, cols)
162
167
}
163
168
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}
166
170
for len(q) > 0 {
167
171
for n := len(q); n > 0; n-- {
168
172
p := q[0]
@@ -171,13 +175,13 @@ func allCellsDistOrder(rows int, cols int, rCenter int, cCenter int) [][]int {
171
175
for k := 0; k < 4; k++ {
172
176
x, y := p[0]+dirs[k], p[1]+dirs[k+1]
173
177
if x >= 0 && x < rows && y >= 0 && y < cols && !vis[x][y] {
174
- q = append(q, []int{x, y})
175
178
vis[x][y] = true
179
+ q = append(q, []int{x, y})
176
180
}
177
181
}
178
182
}
179
183
}
180
- return ans
184
+ return
181
185
}
182
186
```
183
187
0 commit comments