deno.land / x / masx200_leetcode_test@10.6.5 / making-a-large-island / index.ts

نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import { uniqBy } from "../deps.ts";
// const uniqBy=_.uniqByexport default function largestIsland(grid: number[][]): number { const m = grid.length; if (m === 0) { return 0; } const n = grid[0].length; if (n === 0) { return 0; } const islands = getIslands(grid); if (islands.length === 0) { return 1; } const areas = islands.map((i) => i.length);
let max_area = Math.max(...areas);
function is_valid_position(r: number, c: number) { return 0 <= r && r <= m - 1 && 0 <= c && c <= n - 1; } const position_to_area = new Map<number, number>(); const position_to_island_id = new Map<number, number>(); function get_island_id_of_position(r: number, c: number): number { return position_to_island_id.get(unique_id(r, c, n)) ?? 0; } function get_area_of_position(r: number, c: number): number { return position_to_area.get(unique_id(r, c, n)) ?? 0; } for (const [id, island] of islands.entries()) { const area = island.length; for (const position of island) { const [r, c] = position; position_to_area.set(unique_id(r, c, n), area); position_to_island_id.set(unique_id(r, c, n), id); } } for (let r = 0; r < m; ++r) { for (let c = 0; c < n; ++c) { if (grid[r][c] === 0) { let area = 1; const neighbours: [number, number][] = [ [r - 1, c], [r + 1, c], [r, c + 1], [r, c - 1], ]; const uniqed = uniqBy( neighbours.filter( ([x, y]) => is_valid_position(x, y) && grid[x][y] === 1, ), ([x, y]) => get_island_id_of_position(x, y), ); for (const [x, y] of uniqed) { //还要判断是否是相连的岛屿 area += get_area_of_position(x, y); }
max_area = Math.max(area, max_area); } } }
return max_area;}function getIslands(grid: number[][]): Array<[number, number][]> { const m = grid.length; if (m === 0) { return []; } const n = grid[0].length; if (n === 0) { return []; }
const cache = new Set<number>();
const islands: Array<[number, number][]> = [];
for (let r = 0; r < m; ++r) { for (let c = 0; c < n; ++c) { if (cache.has(unique_id(r, c, n))) { continue; } if (grid[r][c] == 1) { // ++num_islands; const island: [number, number][] = []; dfs(grid, r, c, cache, (p: [number, number]) => island.push(p)); islands.push(island); } } }
return islands;}
function dfs( grid: number[][], r: number, c: number, cache: Set<number>, output: (p: [number, number]) => void,): void { const m = grid.length; if (m === 0) { return; } const n = grid[0].length; if (n === 0) { return; }
if (r < 0 || c < 0 || r >= m || c >= n || grid[r][c] == 0) { return; } const id = unique_id(r, c, n); if (cache.has(id)) { return; } cache.add(id); output([r, c]); dfs(grid, r - 1, c, cache, output); dfs(grid, r + 1, c, cache, output); dfs(grid, r, c - 1, cache, output); dfs(grid, r, c + 1, cache, output);}function unique_id(r: number, c: number, n: number): number { const a = c + r * n;
return a;}
masx200_leetcode_test

Version Info

Tagged at
a year ago