1+ /**
2+ * Brute force O(n^3)
3+ *
4+ * Order doesn't matter. E.g. 3 steps stair will count as the same 2-1 and 1-2.
5+ *
6+ * @param n
7+ * @returns {number }
8+ */
9+ function countWaysTripleSteps ( n ) {
10+ let ways = 0 ;
11+
12+ for ( let z = 0 ; z <= n / 3 ; z ++ ) {
13+ for ( let y = 0 ; y <= n / 2 ; y ++ ) {
14+ for ( let x = 0 ; x <= n ; x ++ ) {
15+ if ( n === 1 * x + 2 * y + 3 * z ) {
16+ ways ++ ;
17+ }
18+ }
19+ }
20+ }
21+
22+ return ways ;
23+ }
24+
25+ /**
26+ * Brute force O(n^3)
27+ *
28+ * Order matters. E.g. 3 steps stair will NOT count as the same 2-1 and 1-2.
29+ *
30+ * @param n
31+ * @returns {number }
32+ */
33+ function countWaysTripleSteps2 ( n ) {
34+ let ways = 0 ;
35+
36+ for ( let z = 0 ; z <= n / 3 ; z ++ ) {
37+ for ( let y = 0 ; y <= n / 2 ; y ++ ) {
38+ for ( let x = 0 ; x <= n ; x ++ ) {
39+ if ( n === 1 * x + 2 * y + 3 * z ||
40+ n === 1 * x + 3 * y + 2 * z ||
41+ n === 2 * x + 1 * y + 3 * z ||
42+ n === 2 * x + 3 * y + 1 * z ||
43+ n === 3 * x + 1 * y + 2 * z ||
44+ n === 3 * x + 2 * y + 1 * z ) {
45+ ways ++ ;
46+ }
47+ }
48+ }
49+ }
50+
51+ return ways ;
52+ }
53+
54+ /**
55+ * O(n)
56+ *
57+ * Order matters, 3 steps: 1-2 and 2-1 are two different ways
58+ *
59+ * @param n
60+ * @param memo
61+ * @returns {* }
62+ */
63+ function countWays2 ( n , memo = [ ] ) {
64+ let ways = 0 ;
65+
66+ if ( memo [ n ] ) {
67+ return memo [ n ] ;
68+ }
69+
70+ if ( n === 0 ) {
71+ return 1 ;
72+ }
73+
74+ if ( n - 1 >= 0 ) {
75+ ways += memo [ n - 1 ] || countWays ( n - 1 , memo ) ;
76+ }
77+
78+ if ( n - 2 >= 0 ) {
79+ ways += memo [ n - 2 ] || countWays ( n - 2 , memo ) ;
80+ }
81+
82+ if ( n - 3 >= 0 ) {
83+ ways += memo [ n - 3 ] || countWays ( n - 3 , memo ) ;
84+ }
85+
86+ memo [ n ] = ways ;
87+ return ways ;
88+ }
89+
90+ /**
91+ *
92+ * O(n)
93+ *
94+ * This version is more succinct
95+ * Order matters, 3 steps: 1-2 and 2-1 are two different ways
96+ *
97+ * @param n
98+ * @param memo
99+ * @returns {* }
100+ */
101+ function countWays ( n , memo = [ ] ) {
102+ let ways = 0 ;
103+
104+ if ( n < 0 ) {
105+ return 0 ;
106+ } else if ( n === 0 ) {
107+ return 1 ;
108+ } else if ( memo [ n ] ) {
109+ return memo [ n ] ;
110+ } else {
111+ ways = countWays ( n - 1 , memo ) + countWays ( n - 2 , memo ) + countWays ( n - 3 , memo ) ;
112+ }
113+
114+ memo [ n ] = ways ;
115+ return ways ;
116+ }
117+
118+ module . exports = countWays ;
0 commit comments