File tree 1 file changed +66
-0
lines changed
1 file changed +66
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * @param {number } row
3
+ * @param {number } col
4
+ * @param {number[][] } cells
5
+ * @return {number }
6
+ */
7
+ const latestDayToCross = function ( row , col , cells ) {
8
+ let l = 0 ,
9
+ n = cells . length ,
10
+ r = n - 1 ,
11
+ res = 0
12
+ while ( l < r ) {
13
+ const mid = ~ ~ ( ( l + r ) / 2 )
14
+ if ( canWalk ( mid ) ) {
15
+ l = mid + 1
16
+ res = mid
17
+ } else {
18
+ r = mid
19
+ }
20
+ }
21
+
22
+ return res + 1
23
+
24
+ function canWalk ( mid ) {
25
+ const grid = Array . from ( { length : row } , ( ) => Array ( col ) . fill ( 0 ) )
26
+ const dirs = [
27
+ [ 1 , 0 ] ,
28
+ [ - 1 , 0 ] ,
29
+ [ 0 , 1 ] ,
30
+ [ 0 , - 1 ] ,
31
+ ]
32
+ for ( let i = 0 ; i <= mid ; i ++ ) {
33
+ const [ r , c ] = cells [ i ]
34
+ grid [ r - 1 ] [ c - 1 ] = 1
35
+ }
36
+
37
+ let q = [ ]
38
+
39
+ for ( let i = 0 ; i < col ; i ++ ) {
40
+ if ( grid [ 0 ] [ i ] === 0 ) {
41
+ q . push ( [ 0 , i ] )
42
+ grid [ 0 ] [ i ] = 1
43
+ }
44
+ }
45
+
46
+ while ( q . length ) {
47
+ const size = q . length ,
48
+ tmp = [ ]
49
+ for ( let i = 0 ; i < size ; i ++ ) {
50
+ const [ r , c ] = q [ i ]
51
+ if ( r === row - 1 ) return true
52
+ for ( let [ dr , dc ] of dirs ) {
53
+ const nr = r + dr ,
54
+ nc = c + dc
55
+ if ( nr < 0 || nr >= row || nc < 0 || nc >= col || grid [ nr ] [ nc ] === 1 )
56
+ continue
57
+ tmp . push ( [ nr , nc ] )
58
+ grid [ nr ] [ nc ] = 1
59
+ }
60
+ }
61
+ q = tmp
62
+ }
63
+
64
+ return false
65
+ }
66
+ }
You can’t perform that action at this time.
0 commit comments