71
71
<b >输出:</b >[[2,1],[1,2]]
72
72
<b >解释:</b >起点为 (2,3) 。
73
73
价格范围为 [2,3] ,我们可以选择的物品坐标为 (0,1),(1,1),(1,2) 和 (2,1) 。
74
- 这些物品的排名为:
74
+ 这些物品的排名为:
75
75
- (2,1) 距离为 2 ,价格为 2
76
76
- (1,2) 距离为 2 ,价格为 3
77
77
- (1,1) 距离为 3
@@ -119,7 +119,13 @@ tags:
119
119
120
120
<!-- solution:start -->
121
121
122
- ### 方法一
122
+ ### 方法一:BFS + 排序
123
+
124
+ 我们可以从 $(\textit{row}, \textit{col})$ 出发,使用广度优先搜索找到所有价格在 $[ \textit{low}, \textit{high}] $ 范围内的物品,将这些物品的距离、价格、行坐标和列坐标存入数组 $\textit{pq}$ 中。
125
+
126
+ 最后对 $\textit{pq}$ 按照距离、价格、行坐标和列坐标的顺序排序,取前 $k$ 个物品的坐标返回。
127
+
128
+ 时间复杂度 $O(m \times n \times \log (m \times n))$,空间复杂度 $O(m \times n)$。其中 $m$ 和 $n$ 分别是二维数组 $\textit{grid}$ 的行数和列数。
123
129
124
130
<!-- tabs:start -->
125
131
@@ -131,23 +137,28 @@ class Solution:
131
137
self , grid : List[List[int ]], pricing : List[int ], start : List[int ], k : int
132
138
) -> List[List[int ]]:
133
139
m, n = len (grid), len (grid[0 ])
134
- row, col, low, high = start + pricing
135
- items = []
140
+ row, col = start
141
+ low, high = pricing
142
+ q = deque([(row, col)])
143
+ pq = []
136
144
if low <= grid[row][col] <= high:
137
- items.append([0 , grid[row][col], row, col])
138
- q = deque([(row, col, 0 )])
145
+ pq.append((0 , grid[row][col], row, col))
139
146
grid[row][col] = 0
147
+ dirs = (- 1 , 0 , 1 , 0 , - 1 )
148
+ step = 0
140
149
while q:
141
- i, j, d = q.popleft()
142
- for a, b in [[0 , 1 ], [0 , - 1 ], [1 , 0 ], [- 1 , 0 ]]:
143
- x, y = i + a, j + b
144
- if 0 <= x < m and 0 <= y < n and grid[x][y]:
145
- if low <= grid[x][y] <= high:
146
- items.append([d + 1 , grid[x][y], x, y])
147
- q.append((x, y, d + 1 ))
148
- grid[x][y] = 0
149
- items.sort()
150
- return [item[2 :] for item in items][:k]
150
+ step += 1
151
+ for _ in range (len (q)):
152
+ x, y = q.popleft()
153
+ for a, b in pairwise(dirs):
154
+ nx, ny = x + a, y + b
155
+ if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] > 0 :
156
+ if low <= grid[nx][ny] <= high:
157
+ pq.append((step, grid[nx][ny], nx, ny))
158
+ grid[nx][ny] = 0
159
+ q.append((nx, ny))
160
+ pq.sort()
161
+ return [list (x[2 :]) for x in pq[:k]]
151
162
```
152
163
153
164
#### Java
@@ -156,47 +167,46 @@ class Solution:
156
167
class Solution {
157
168
public List<List<Integer > > highestRankedKItems (
158
169
int [][] grid , int [] pricing , int [] start , int k ) {
159
- int m = grid. length, n = grid[0 ]. length;
170
+ int m = grid. length;
171
+ int n = grid[0 ]. length;
160
172
int row = start[0 ], col = start[1 ];
161
173
int low = pricing[0 ], high = pricing[1 ];
162
- List<int[]> items = new ArrayList<> ();
174
+ Deque<int[]> q = new ArrayDeque<> ();
175
+ q. offer(new int [] {row, col});
176
+ List<int[]> pq = new ArrayList<> ();
163
177
if (low <= grid[row][col] && grid[row][col] <= high) {
164
- items . add(new int [] {0 , grid[row][col], row, col});
178
+ pq . add(new int [] {0 , grid[row][col], row, col});
165
179
}
166
180
grid[row][col] = 0 ;
167
- Deque<int[]> q = new ArrayDeque<> ();
168
- q. offer(new int [] {row, col, 0 });
169
- int [] dirs = {- 1 , 0 , 1 , 0 , - 1 };
170
- while (! q. isEmpty()) {
171
- int [] p = q. poll();
172
- int i = p[0 ], j = p[1 ], d = p[2 ];
173
- for (int l = 0 ; l < 4 ; ++ l) {
174
- int x = i + dirs[l], y = j + dirs[l + 1 ];
175
- if (x >= 0 && x < m && y >= 0 && y < n && grid[x][y] > 0 ) {
176
- if (low <= grid[x][y] && grid[x][y] <= high) {
177
- items. add(new int [] {d + 1 , grid[x][y], x, y});
181
+ final int [] dirs = {- 1 , 0 , 1 , 0 , - 1 };
182
+ for (int step = 1 ; ! q. isEmpty(); ++ step) {
183
+ for (int size = q. size(); size > 0 ; -- size) {
184
+ int [] curr = q. poll();
185
+ int x = curr[0 ], y = curr[1 ];
186
+ for (int j = 0 ; j < 4 ; j++ ) {
187
+ int nx = x + dirs[j];
188
+ int ny = y + dirs[j + 1 ];
189
+ if (0 <= nx && nx < m && 0 <= ny && ny < n && grid[nx][ny] > 0 ) {
190
+ if (low <= grid[nx][ny] && grid[nx][ny] <= high) {
191
+ pq. add(new int [] {step, grid[nx][ny], nx, ny});
192
+ }
193
+ grid[nx][ny] = 0 ;
194
+ q. offer(new int [] {nx, ny});
178
195
}
179
- grid[x][y] = 0 ;
180
- q. offer(new int [] {x, y, d + 1 });
181
196
}
182
197
}
183
198
}
184
- items. sort((a, b) - > {
185
- if (a[0 ] != b[0 ]) {
186
- return a[0 ] - b[0 ];
187
- }
188
- if (a[1 ] != b[1 ]) {
189
- return a[1 ] - b[1 ];
190
- }
191
- if (a[2 ] != b[2 ]) {
192
- return a[2 ] - b[2 ];
193
- }
194
- return a[3 ] - b[3 ];
199
+
200
+ pq. sort((a, b) - > {
201
+ if (a[0 ] != b[0 ]) return Integer . compare(a[0 ], b[0 ]);
202
+ if (a[1 ] != b[1 ]) return Integer . compare(a[1 ], b[1 ]);
203
+ if (a[2 ] != b[2 ]) return Integer . compare(a[2 ], b[2 ]);
204
+ return Integer . compare(a[3 ], b[3 ]);
195
205
});
206
+
196
207
List<List<Integer > > ans = new ArrayList<> ();
197
- for (int i = 0 ; i < items. size() && i < k; ++ i) {
198
- int [] p = items. get(i);
199
- ans. add(Arrays . asList(p[2 ], p[3 ]));
208
+ for (int i = 0 ; i < Math . min(k, pq. size()); i++ ) {
209
+ ans. add(List . of(pq. get(i)[2 ], pq. get(i)[3 ]));
200
210
}
201
211
return ans;
202
212
}
@@ -212,30 +222,36 @@ public:
212
222
int m = grid.size(), n = grid[ 0] .size();
213
223
int row = start[ 0] , col = start[ 1] ;
214
224
int low = pricing[ 0] , high = pricing[ 1] ;
215
- vector<tuple<int, int, int, int>> items;
216
- if (low <= grid[ row] [ col ] && grid[ row] [ col ] <= high)
217
- items.emplace_back(0, grid[ row] [ col ] , row, col);
218
- queue<tuple<int, int, int>> q;
219
- q.emplace(row, col, 0);
225
+ queue<pair<int, int>> q;
226
+ q.push({row, col});
227
+ vector<tuple<int, int, int, int>> pq;
228
+ if (low <= grid[ row] [ col ] && grid[ row] [ col ] <= high) {
229
+ pq.push_back({0, grid[ row] [ col ] , row, col});
230
+ }
220
231
grid[ row] [ col ] = 0;
221
232
vector<int > dirs = {-1, 0, 1, 0, -1};
222
- while (!q.empty()) {
223
- auto [ i, j, d] = q.front();
224
- q.pop();
225
- for (int l = 0; l < 4; ++l) {
226
- int x = i + dirs[ l] , y = j + dirs[ l + 1] ;
227
- if (x >= 0 && x < m && y >= 0 && y < n && grid[ x] [ y ] ) {
228
- if (low <= grid[ x] [ y ] && grid[ x] [ y ] <= high) items.emplace_back(d + 1, grid[ x] [ y ] , x, y);
229
- grid[ x] [ y ] = 0;
230
- q.emplace(x, y, d + 1);
233
+ for (int step = 1; q.size(); ++step) {
234
+ int sz = q.size();
235
+ for (int i = 0; i < sz; ++i) {
236
+ auto [ x, y] = q.front();
237
+ q.pop();
238
+ for (int j = 0; j < 4; ++j) {
239
+ int nx = x + dirs[ j] ;
240
+ int ny = y + dirs[ j + 1] ;
241
+ if (0 <= nx && nx < m && 0 <= ny && ny < n && grid[ nx] [ ny ] > 0) {
242
+ if (low <= grid[ nx] [ ny ] && grid[ nx] [ ny ] <= high) {
243
+ pq.push_back({step, grid[ nx] [ ny ] , nx, ny});
244
+ }
245
+ grid[ nx] [ ny ] = 0;
246
+ q.push({nx, ny});
247
+ }
231
248
}
232
249
}
233
250
}
234
- sort(items .begin(), items .end());
251
+ sort(pq .begin(), pq .end());
235
252
vector<vector<int >> ans;
236
- for (int i = 0; i < items.size() && i < k; ++i) {
237
- auto [ d, p, x, y] = items[ i] ;
238
- ans.push_back({x, y});
253
+ for (int i = 0; i < min(k, (int) pq.size()); ++i) {
254
+ ans.push_back({get<2>(pq[ i] ), get<3>(pq[ i] )});
239
255
}
240
256
return ans;
241
257
}
@@ -245,34 +261,35 @@ public:
245
261
#### Go
246
262
247
263
```go
248
- func highestRankedKItems(grid [][]int, pricing []int, start []int, k int) [][]int {
264
+ func highestRankedKItems(grid [][]int, pricing []int, start []int, k int) (ans [][]int) {
249
265
m, n := len(grid), len(grid[0])
250
266
row, col := start[0], start[1]
251
267
low, high := pricing[0], pricing[1]
252
- var items [][]int
268
+ q := [][2]int{{row, col}}
269
+ pq := [][]int{}
253
270
if low <= grid[row][col] && grid[row][col] <= high {
254
- items = append(items , []int{0, grid[row][col], row, col})
271
+ pq = append(pq , []int{0, grid[row][col], row, col})
255
272
}
256
- q := [][]int{{row, col, 0}}
257
273
grid[row][col] = 0
258
- dirs := []int{-1, 0, 1, 0, -1}
259
- for len(q) > 0 {
260
- p := q[0]
261
- q = q[1:]
262
- i, j, d := p[0], p[1], p[2]
263
- for l := 0; l < 4; l++ {
264
- x, y := i+dirs[l], j+dirs[l+1]
265
- if x >= 0 && x < m && y >= 0 && y < n && grid[x][y] > 0 {
266
- if low <= grid[x][y] && grid[x][y] <= high {
267
- items = append(items, []int{d + 1, grid[x][y], x, y})
274
+ dirs := [5]int{-1, 0, 1, 0, -1}
275
+ for step := 1; len(q) > 0; step++ {
276
+ for sz := len(q); sz > 0; sz-- {
277
+ x, y := q[0][0], q[0][1]
278
+ q = q[1:]
279
+ for j := 0; j < 4; j++ {
280
+ nx, ny := x+dirs[j], y+dirs[j+1]
281
+ if nx >= 0 && nx < m && ny >= 0 && ny < n && grid[nx][ny] > 0 {
282
+ if low <= grid[nx][ny] && grid[nx][ny] <= high {
283
+ pq = append(pq, []int{step, grid[nx][ny], nx, ny})
284
+ }
285
+ grid[nx][ny] = 0
286
+ q = append(q, [2]int{nx, ny})
268
287
}
269
- grid[x][y] = 0
270
- q = append(q, []int{x, y, d + 1})
271
288
}
272
289
}
273
290
}
274
- sort.Slice(items , func(i, j int) bool {
275
- a, b := items [i], items [j]
291
+ sort.Slice(pq , func(i, j int) bool {
292
+ a, b := pq [i], pq [j]
276
293
if a[0] != b[0] {
277
294
return a[0] < b[0]
278
295
}
@@ -284,11 +301,60 @@ func highestRankedKItems(grid [][]int, pricing []int, start []int, k int) [][]in
284
301
}
285
302
return a[3] < b[3]
286
303
})
287
- var ans [][]int
288
- for i := 0; i < len(items) && i < k; i++ {
289
- ans = append(ans, items[i][2:])
304
+ for i := 0; i < len(pq) && i < k; i++ {
305
+ ans = append(ans, pq[i][2:])
290
306
}
291
- return ans
307
+ return
308
+ }
309
+ ```
310
+
311
+ #### TypeScript
312
+
313
+ ``` ts
314
+ function highestRankedKItems(
315
+ grid : number [][],
316
+ pricing : number [],
317
+ start : number [],
318
+ k : number ,
319
+ ): number [][] {
320
+ const [m, n] = [grid .length , grid [0 ].length ];
321
+ const [row, col] = start ;
322
+ const [low, high] = pricing ;
323
+ let q: [number , number ][] = [[row , col ]];
324
+ const pq: [number , number , number , number ][] = [];
325
+ if (low <= grid [row ][col ] && grid [row ][col ] <= high ) {
326
+ pq .push ([0 , grid [row ][col ], row , col ]);
327
+ }
328
+ grid [row ][col ] = 0 ;
329
+ const dirs = [- 1 , 0 , 1 , 0 , - 1 ];
330
+ for (let step = 1 ; q .length > 0 ; ++ step ) {
331
+ const nq: [number , number ][] = [];
332
+ for (const [x, y] of q ) {
333
+ for (let j = 0 ; j < 4 ; j ++ ) {
334
+ const nx = x + dirs [j ];
335
+ const ny = y + dirs [j + 1 ];
336
+ if (nx >= 0 && nx < m && ny >= 0 && ny < n && grid [nx ][ny ] > 0 ) {
337
+ if (low <= grid [nx ][ny ] && grid [nx ][ny ] <= high ) {
338
+ pq .push ([step , grid [nx ][ny ], nx , ny ]);
339
+ }
340
+ grid [nx ][ny ] = 0 ;
341
+ nq .push ([nx , ny ]);
342
+ }
343
+ }
344
+ }
345
+ q = nq ;
346
+ }
347
+ pq .sort ((a , b ) => {
348
+ if (a [0 ] !== b [0 ]) return a [0 ] - b [0 ];
349
+ if (a [1 ] !== b [1 ]) return a [1 ] - b [1 ];
350
+ if (a [2 ] !== b [2 ]) return a [2 ] - b [2 ];
351
+ return a [3 ] - b [3 ];
352
+ });
353
+ const ans: number [][] = [];
354
+ for (let i = 0 ; i < Math .min (k , pq .length ); i ++ ) {
355
+ ans .push ([pq [i ][2 ], pq [i ][3 ]]);
356
+ }
357
+ return ans ;
292
358
}
293
359
```
294
360
0 commit comments