3
3
* @return {number[] }
4
4
*/
5
5
const spiralOrder = ( matrix ) => {
6
- if ( matrix . length === 1 ) return matrix [ 0 ] ;
7
- let nextDirection = new Map ( ) , formula = new Map ( ) ;
8
- nextDirection . set ( "r" , "b" )
9
- nextDirection . set ( "b" , "l" )
10
- nextDirection . set ( "l" , "t" )
11
- nextDirection . set ( "t" , "r" )
12
-
13
- formula . set ( "r" , { r : 0 , c : 1 } )
14
- formula . set ( "b" , { r : 1 , c : 0 } )
15
- formula . set ( "l" , { r : 0 , c : - 1 } )
16
- formula . set ( "t" , { r : - 1 , c : 0 } )
17
-
18
- console . log ( nextDirection )
19
- console . log ( formula )
20
-
21
- let spiralList = [ ] ;
22
-
23
- const moveNext = ( r , c , dir ) => {
24
- let nextDir = nextDirection . get ( dir ) ;
25
- let { r : newR , c : newC } = formula . get ( nextDir ) ;
26
- console . log ( `>> Going nextDir:${ nextDir } , newR:${ r + newR + ( r === matrix . length ? - 1 : 0 ) } , newC:${ c + newC + ( c === matrix [ 0 ] . length ? - 1 : 0 ) } ` )
27
- // let isREdge = r > matrix.length, isCEdge = c > matrix[0].length;
28
- // console.log("matrix[0].length ")
29
- // console.log(matrix[0].length)
30
-
31
- newR += r + ( r === matrix . length ? - 1 : 0 ) + ( r < 0 ? 1 : 0 )
32
- newC += c + ( c === matrix [ 0 ] . length ? - 1 : 0 ) + ( c < 0 ? 1 : 0 )
33
-
34
- return { r : newR , c : newC , dir : nextDir } ;
35
- }
6
+ let left = 0 , right = matrix [ 0 ] . length , top = 0 , bot = matrix . length , spiralList = [ ] ;
7
+
8
+ while ( left < right && top < bot ) {
9
+ for ( let i = left ; i < right ; i ++ ) {
10
+ spiralList . push ( matrix [ top ] [ i ] ) ;
11
+ }
12
+ top += 1 ;
13
+
14
+ if ( left >= right || top >= bot ) {
15
+ console . log ( "??" )
16
+ break ;
17
+ }
36
18
37
- const explore = ( r , c , dir , tBorder , rBorder , bBorder , lBorder ) => {
38
- console . log ( `> r:${ r } , c:${ c } , dir:${ dir } , tBorder:${ tBorder } , rBorder:${ rBorder } , bBorder:${ bBorder } , lBorder:${ lBorder } ` )
39
-
40
- // edge
41
- console . log ( r - bBorder === matrix . length )
42
- console . log ( c - rBorder === matrix [ 0 ] . length )
43
- console . log ( ( dir === "t" && r < 0 + tBorder ) )
44
- console . log ( ( dir === "l" && c < 0 + lBorder ) )
45
- console . log ( ( dir === "r" && c + rBorder === matrix [ 0 ] . length ) )
46
- console . log ( ( dir === "b" && r + bBorder === matrix . length ) )
47
- if (
48
- r - bBorder === matrix . length ||
49
- c - rBorder === matrix [ 0 ] . length ||
50
- ( dir === "t" && r < 0 + tBorder ) ||
51
- ( dir === "l" && c < 0 + lBorder ) ||
52
- ( dir === "r" && c + rBorder === matrix [ 0 ] . length ) ||
53
- ( dir === "b" && r + bBorder === matrix . length )
54
- ) {
55
- let next = moveNext ( r , c , dir ) ;
56
-
57
- explore (
58
- next . r + ( next . dir === "r" ? tBorder : 0 ) + ( next . dir === "l" ? - bBorder : 0 ) ,
59
- next . c + ( next . dir === "b" ? - rBorder : 0 ) + ( next . dir === "t" ? lBorder : 0 ) ,
60
- next . dir ,
61
- tBorder + ( next . dir === "r" ? 1 : 0 ) ,
62
- rBorder + ( next . dir === "b" ? 1 : 0 ) ,
63
- bBorder + ( next . dir === "l" ? 1 : 0 ) ,
64
- lBorder + ( next . dir === "t" ? 1 : 0 ) ) ;
65
- return ;
19
+ for ( let i = top ; i < bot ; i ++ ) {
20
+ spiralList . push ( matrix [ i ] [ right - 1 ] ) ;
66
21
}
22
+ right -= 1 ;
67
23
68
- // visited - end
69
- // if (matrix.length < tries) {
70
- // return;
71
- // }
72
-
73
- if ( Infinity === matrix [ r ] [ c ] ) {
74
- // let next = moveNext(r, c, dir);
75
- // explore(next.r, next.c, next.dir, tries + 1);
76
-
77
- // let nextDir = nextDirection.get(dir);
78
- // let { r: newR, c: newC } = formula.get(nextDir);
79
- // console.log(`>> Going newR:${r + newR + (r === matrix.length ? -1 : 0)}, newC:${c + newC + (c === matrix[0].length ? -1 : 0)}`)
80
- // // let isREdge = r > matrix.length, isCEdge = c > matrix[0].length;
81
- // console.log("matrix[0].length ")
82
- // console.log(matrix[0].length)
83
- //
84
- // newR += r + (r === matrix.length ? -1 : 0) + (r < 0 ? 1 : 0) - ((formula.get(dir).r));
85
- // newC += c + (c === matrix[0].length ? -1 : 0) + (c < 0 ? 1 : 0) - ((formula.get(dir).c));
86
- //
87
- // explore(newR, newC, nextDir, tBorder, rBorder, bBorder, lBorder);
88
- return ;
24
+
25
+ for ( let i = right - 1 ; i >= left ; i -- ) {
26
+ spiralList . push ( matrix [ bot - 1 ] [ i ] ) ;
89
27
}
28
+ bot -= 1 ;
90
29
91
- spiralList . push ( matrix [ r ] [ c ] ) ;
92
- matrix [ r ] [ c ] = Infinity ;
30
+ for ( let i = bot - 1 ; i >= top ; i -- ) {
31
+ spiralList . push ( matrix [ i ] [ left ] ) ;
32
+ }
33
+ left += 1 ;
93
34
94
- let dirFormula = formula . get ( dir ) ;
95
- // console.log(`> r:${r}, c:${c}, addR:${dirFormula.r}, addC:${dirFormula.c}`)
96
- // if next we turn
97
- // matrix[r + dirFormula.r][c + dirFormula.c];
98
- explore ( r + dirFormula . r , c + dirFormula . c , dir , tBorder , rBorder , bBorder , lBorder )
35
+ console . log ( `> l:${ left } , r:${ right } , t:${ top } , b:${ bot } ` )
99
36
}
100
37
101
- explore ( 0 , 0 , "r" , 1 , 0 , 0 , 0 ) ;
102
38
console . log ( matrix )
103
39
return spiralList ;
104
40
} ;
@@ -120,13 +56,13 @@ let x = null;
120
56
// ]);
121
57
122
58
// [1,2,3,4,5,10,15,20,25,24,23,22,21,16,11,6,7,8,9,14,19,18,17,12,13]
123
- x = spiralOrder ( [
124
- [ 1 , 2 , 3 , 4 , 5 ] ,
125
- [ 6 , 7 , 8 , 9 , 10 ] ,
126
- [ 11 , 12 , 13 , 14 , 15 ] ,
127
- [ 16 , 17 , 18 , 19 , 20 ] ,
128
- [ 21 , 22 , 23 , 24 , 25 ]
129
- ] ) ;
59
+ // x = spiralOrder([
60
+ // [1, 2, 3, 4, 5],
61
+ // [6, 7, 8, 9, 10],
62
+ // [11, 12, 13, 14, 15],
63
+ // [16, 17, 18, 19, 20],
64
+ // [21, 22, 23, 24, 25]
65
+ // ]);
130
66
131
67
// x = spiralOrder([[1]]);
132
68
@@ -139,10 +75,21 @@ x = spiralOrder([
139
75
// ]);
140
76
141
77
// [1,2,3,4,8,12,11,10,9,5,6,7]
78
+ x = spiralOrder ( [
79
+ [ 1 , 2 , 3 , 4 ] ,
80
+ [ 5 , 6 , 7 , 8 ] ,
81
+ [ 9 , 10 , 11 , 12 ]
82
+ ] ) ;
83
+
142
84
// x = spiralOrder([
143
- // [1, 2, 3, 4],
144
- // [5, 6, 7, 8],
145
- // [9, 10, 11, 12]
85
+ // [1, 2, 3, 4]
86
+ // ]);
87
+
88
+ // x = spiralOrder([
89
+ // [1],
90
+ // [2],
91
+ // [3],
92
+ // [4]
146
93
// ]);
147
94
148
95
// [1,2,3,6,9,8,7,4,5]
0 commit comments