forked from doocs/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolution2.ts
55 lines (54 loc) · 1.53 KB
/
Solution2.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
function maximumSafenessFactor(grid: number[][]): number {
const n = grid.length;
const g = Array.from({ length: n }, () => new Array(n).fill(-1));
const vis = Array.from({ length: n }, () => new Array(n).fill(false));
let q: [number, number][] = [];
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (grid[i][j] === 1) {
q.push([i, j]);
}
}
}
let level = 0;
while (q.length) {
const t: [number, number][] = [];
for (const [x, y] of q) {
if (x < 0 || y < 0 || x === n || y === n || g[x][y] !== -1) {
continue;
}
g[x][y] = level;
t.push([x + 1, y]);
t.push([x - 1, y]);
t.push([x, y + 1]);
t.push([x, y - 1]);
}
q = t;
level++;
}
const dfs = (i: number, j: number, v: number) => {
if (i < 0 || j < 0 || i === n || j === n || vis[i][j] || g[i][j] <= v) {
return false;
}
vis[i][j] = true;
return (
(i === n - 1 && j === n - 1) ||
dfs(i + 1, j, v) ||
dfs(i, j + 1, v) ||
dfs(i - 1, j, v) ||
dfs(i, j - 1, v)
);
};
let left = 0;
let right = level;
while (left < right) {
vis.forEach(v => v.fill(false));
const mid = (left + right) >>> 1;
if (dfs(0, 0, mid)) {
left = mid + 1;
} else {
right = mid;
}
}
return right;
}