Skip to content

Commit 01bf266

Browse files
authored
feat: add solutions to lc problem: No.2146 (doocs#3510)
No.2146.K Highest Ranked Items Within a Price Range
1 parent 9f4cdb7 commit 01bf266

File tree

7 files changed

+448
-261
lines changed

7 files changed

+448
-261
lines changed

solution/2100-2199/2146.K Highest Ranked Items Within a Price Range/README.md

Lines changed: 152 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ tags:
7171
<b>输出:</b>[[2,1],[1,2]]
7272
<b>解释:</b>起点为 (2,3) 。
7373
价格范围为 [2,3] ,我们可以选择的物品坐标为 (0,1),(1,1),(1,2) 和 (2,1) 。
74-
这些物品的排名为:
74+
这些物品的排名为:
7575
- (2,1) 距离为 2 ,价格为 2
7676
- (1,2) 距离为 2 ,价格为 3
7777
- (1,1) 距离为 3
@@ -119,7 +119,13 @@ tags:
119119

120120
<!-- solution:start -->
121121

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}$ 的行数和列数。
123129

124130
<!-- tabs:start -->
125131

@@ -131,23 +137,28 @@ class Solution:
131137
self, grid: List[List[int]], pricing: List[int], start: List[int], k: int
132138
) -> List[List[int]]:
133139
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 = []
136144
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))
139146
grid[row][col] = 0
147+
dirs = (-1, 0, 1, 0, -1)
148+
step = 0
140149
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]]
151162
```
152163

153164
#### Java
@@ -156,47 +167,46 @@ class Solution:
156167
class Solution {
157168
public List<List<Integer>> highestRankedKItems(
158169
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;
160172
int row = start[0], col = start[1];
161173
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<>();
163177
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});
165179
}
166180
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});
178195
}
179-
grid[x][y] = 0;
180-
q.offer(new int[] {x, y, d + 1});
181196
}
182197
}
183198
}
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]);
195205
});
206+
196207
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]));
200210
}
201211
return ans;
202212
}
@@ -212,30 +222,36 @@ public:
212222
int m = grid.size(), n = grid[0].size();
213223
int row = start[0], col = start[1];
214224
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+
}
220231
grid[row][col] = 0;
221232
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+
}
231248
}
232249
}
233250
}
234-
sort(items.begin(), items.end());
251+
sort(pq.begin(), pq.end());
235252
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])});
239255
}
240256
return ans;
241257
}
@@ -245,34 +261,35 @@ public:
245261
#### Go
246262
247263
```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) {
249265
m, n := len(grid), len(grid[0])
250266
row, col := start[0], start[1]
251267
low, high := pricing[0], pricing[1]
252-
var items [][]int
268+
q := [][2]int{{row, col}}
269+
pq := [][]int{}
253270
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})
255272
}
256-
q := [][]int{{row, col, 0}}
257273
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})
268287
}
269-
grid[x][y] = 0
270-
q = append(q, []int{x, y, d + 1})
271288
}
272289
}
273290
}
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]
276293
if a[0] != b[0] {
277294
return a[0] < b[0]
278295
}
@@ -284,11 +301,60 @@ func highestRankedKItems(grid [][]int, pricing []int, start []int, k int) [][]in
284301
}
285302
return a[3] < b[3]
286303
})
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:])
290306
}
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;
292358
}
293359
```
294360

0 commit comments

Comments
 (0)