From e395595c0b1416bd0e12f5eee4cdfe826d95c2bc Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Wed, 21 Oct 2020 19:53:58 -0700 Subject: [PATCH 01/12] tripleStep Backtracking, Top Down and Bottom up memoization implementation --- chapter08/8.01 - Triple Step/tripleStep.js | 63 +++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index 12d1fa4..45a64fe 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -1,4 +1,22 @@ -var numWays = function(N) { +/* +Recursion and Dynamic Programming (4 steps) +1. Start with the recursive backtracking solution +2. Optimize by using a memoization table (top-down dynamic programming) +3. Remove the need for recursion (bottom-up dynamic programming) +4. Apply final tricks to reduce the time / memory complexity +*/ + +/* +Triple Step: +A child is running up a staircase with n steps and +can hop either 1 step, 2 steps, or 3 steps at a time. + +Implement a method to count how many possible ways +the child can run up the stairs. + */ + + +var numWays = function(N) { var answer = 0; var recurse = function(number) { if (number === 0) { @@ -13,8 +31,51 @@ var numWays = function(N) { return answer; }; +// Recursive BackTracking +// Time & Space O(n!) +/* +var numWays = function(n, res=0) { + if (n < 0) return 0 + if (n === 0) { + res++ + return res + } + return numWays(n - 1) + numWays(n - 2) + numWays(n - 3) +} +*/ + +// Top Down Memoization +// Time & Space O(n) +/* +var numWays = function(n, i=3, memo = [1, 1, 2, 4]) { + if (n < 0) return memo[0] + if (n === 1) return memo[n] + if (i > n ) return memo[memo.length - 1] + memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] + return numWays(n, i+1, memo) +} +*/ + +// Bottom Up memoization +// Time & Space O(n) +/* +var numWays = function(n, memo=[1,1,2,4]) { + + for (let i = 3; i <= n; i++) { + memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] + } + + return memo[memo.length - 1] +} +*/ + + /* TEST */ console.log(numWays(1), 1); console.log(numWays(2), 2); console.log(numWays(3), 4); +console.log(numWays(5), 13) +console.log(numWays(7), 44) +console.log(numWays(10), 274); + From 306b9cbc4b8ffc6bea8d31c981f2f412773a0537 Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Wed, 21 Oct 2020 20:01:23 -0700 Subject: [PATCH 02/12] removed comments --- chapter08/8.01 - Triple Step/tripleStep.js | 59 ++++------------------ 1 file changed, 11 insertions(+), 48 deletions(-) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index 45a64fe..33fce52 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -1,65 +1,30 @@ -/* -Recursion and Dynamic Programming (4 steps) -1. Start with the recursive backtracking solution -2. Optimize by using a memoization table (top-down dynamic programming) -3. Remove the need for recursion (bottom-up dynamic programming) -4. Apply final tricks to reduce the time / memory complexity -*/ - -/* -Triple Step: -A child is running up a staircase with n steps and -can hop either 1 step, 2 steps, or 3 steps at a time. - -Implement a method to count how many possible ways -the child can run up the stairs. - */ - - -var numWays = function(N) { - var answer = 0; - var recurse = function(number) { - if (number === 0) { - answer++; - } else if (number > 0) { - recurse(number - 1); - recurse(number - 2); - recurse(number - 3); - } - }; - recurse(N); - return answer; -}; - // Recursive BackTracking // Time & Space O(n!) -/* -var numWays = function(n, res=0) { +var tripleStep = function(n, res=0) { if (n < 0) return 0 if (n === 0) { res++ return res } - return numWays(n - 1) + numWays(n - 2) + numWays(n - 3) + return tripleStep(n - 1) + tripleStep(n - 2) + tripleStep(n - 3) } -*/ // Top Down Memoization // Time & Space O(n) /* -var numWays = function(n, i=3, memo = [1, 1, 2, 4]) { +var tripleStep = function(n, i=3, memo = [1, 1, 2, 4]) { if (n < 0) return memo[0] if (n === 1) return memo[n] if (i > n ) return memo[memo.length - 1] memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] - return numWays(n, i+1, memo) + return tripleStep(n, i+1, memo) } */ // Bottom Up memoization // Time & Space O(n) /* -var numWays = function(n, memo=[1,1,2,4]) { +var tripleStep = function(n, memo=[1,1,2,4]) { for (let i = 3; i <= n; i++) { memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] @@ -69,13 +34,11 @@ var numWays = function(n, memo=[1,1,2,4]) { } */ - /* TEST */ - -console.log(numWays(1), 1); -console.log(numWays(2), 2); -console.log(numWays(3), 4); -console.log(numWays(5), 13) -console.log(numWays(7), 44) -console.log(numWays(10), 274); +console.log(tripleStep(1), 1); +console.log(tripleStep(2), 2); +console.log(tripleStep(3), 4); +console.log(tripleStep(5), 13) +console.log(tripleStep(7), 44) +console.log(tripleStep(10), 274); From f22ccd780457de4d6e4f8a87dc937852726d80c0 Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Wed, 21 Oct 2020 20:02:41 -0700 Subject: [PATCH 03/12] removed more comments --- chapter08/8.01 - Triple Step/tripleStep.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index 33fce52..8017fd1 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -11,7 +11,6 @@ var tripleStep = function(n, res=0) { // Top Down Memoization // Time & Space O(n) -/* var tripleStep = function(n, i=3, memo = [1, 1, 2, 4]) { if (n < 0) return memo[0] if (n === 1) return memo[n] @@ -19,11 +18,9 @@ var tripleStep = function(n, i=3, memo = [1, 1, 2, 4]) { memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] return tripleStep(n, i+1, memo) } -*/ // Bottom Up memoization // Time & Space O(n) -/* var tripleStep = function(n, memo=[1,1,2,4]) { for (let i = 3; i <= n; i++) { @@ -32,7 +29,6 @@ var tripleStep = function(n, memo=[1,1,2,4]) { return memo[memo.length - 1] } -*/ /* TEST */ console.log(tripleStep(1), 1); From a8b15b9d193065ca2988da2b2a8e8c3f679663cd Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Fri, 6 Nov 2020 17:49:34 -0800 Subject: [PATCH 04/12] 8.01 tripleStep O(1) or constant space --- chapter08/8.01 - Triple Step/tripleStep.js | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index 8017fd1..571a09e 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -1,3 +1,12 @@ +/* +Recursion and Dynamic Programming (4 steps) +1. Start with the recursive backtracking solution (Brute Force) +2. Optimize by using a memoization table (top-down dynamic programming) +3. Remove the need for recursion (bottom-up dynamic programming) +4. Apply final tricks to reduce the time / memory complexity +*/ + +/* // Recursive BackTracking // Time & Space O(n!) var tripleStep = function(n, res=0) { @@ -29,6 +38,27 @@ var tripleStep = function(n, memo=[1,1,2,4]) { return memo[memo.length - 1] } +*/ + +// Removed Memoization +// Time O(n) & Space O(1) +var tripleStep = function(n) { + if (n <= 0) return 0 + if (n === 1) return 1 + if (n === 2) return 2 + + let a = 1 + let b = 1 + let c = 2 + + for (let i = 3; i < n; i++) { + let d = a + b + c + a = b + b = c + c = d + } + return a + b + c +} /* TEST */ console.log(tripleStep(1), 1); From 8fcc71744cb92e941d1eefafba08fa2fc1958efa Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Fri, 6 Nov 2020 17:51:18 -0800 Subject: [PATCH 05/12] removed multi-line comment --- chapter08/8.01 - Triple Step/tripleStep.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index 571a09e..d12b445 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -6,7 +6,6 @@ Recursion and Dynamic Programming (4 steps) 4. Apply final tricks to reduce the time / memory complexity */ -/* // Recursive BackTracking // Time & Space O(n!) var tripleStep = function(n, res=0) { @@ -38,7 +37,6 @@ var tripleStep = function(n, memo=[1,1,2,4]) { return memo[memo.length - 1] } -*/ // Removed Memoization // Time O(n) & Space O(1) From 71c9eebbd8b763618584d85188859a40a6f483d8 Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Fri, 6 Nov 2020 17:56:32 -0800 Subject: [PATCH 06/12] less bloating code for triple step --- chapter08/8.01 - Triple Step/tripleStep.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index d12b445..6ea4cd1 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -10,10 +10,7 @@ Recursion and Dynamic Programming (4 steps) // Time & Space O(n!) var tripleStep = function(n, res=0) { if (n < 0) return 0 - if (n === 0) { - res++ - return res - } + if (n === 0) return 1 return tripleStep(n - 1) + tripleStep(n - 2) + tripleStep(n - 3) } @@ -30,7 +27,6 @@ var tripleStep = function(n, i=3, memo = [1, 1, 2, 4]) { // Bottom Up memoization // Time & Space O(n) var tripleStep = function(n, memo=[1,1,2,4]) { - for (let i = 3; i <= n; i++) { memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] } From bd53d3ddc905c1078243f9cf6607f6eb18ced0f8 Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Fri, 6 Nov 2020 17:58:30 -0800 Subject: [PATCH 07/12] constant space solution --- chapter08/8.01 - Triple Step/tripleStep.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index 6ea4cd1..cd6be38 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -10,7 +10,7 @@ Recursion and Dynamic Programming (4 steps) // Time & Space O(n!) var tripleStep = function(n, res=0) { if (n < 0) return 0 - if (n === 0) return 1 + if (n === 0) return 1 return tripleStep(n - 1) + tripleStep(n - 2) + tripleStep(n - 3) } @@ -20,6 +20,7 @@ var tripleStep = function(n, i=3, memo = [1, 1, 2, 4]) { if (n < 0) return memo[0] if (n === 1) return memo[n] if (i > n ) return memo[memo.length - 1] + memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] return tripleStep(n, i+1, memo) } @@ -34,7 +35,7 @@ var tripleStep = function(n, memo=[1,1,2,4]) { return memo[memo.length - 1] } -// Removed Memoization +// Constant Space // Time O(n) & Space O(1) var tripleStep = function(n) { if (n <= 0) return 0 From 87ad856eacab943cb142ebf9494f6eec4c029149 Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Sun, 28 Feb 2021 16:08:45 -0800 Subject: [PATCH 08/12] tripleStep version 2 --- chapter08/8.01 - Triple Step/tripleStepv2.js | 64 ++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 chapter08/8.01 - Triple Step/tripleStepv2.js diff --git a/chapter08/8.01 - Triple Step/tripleStepv2.js b/chapter08/8.01 - Triple Step/tripleStepv2.js new file mode 100644 index 0000000..3d10bcf --- /dev/null +++ b/chapter08/8.01 - Triple Step/tripleStepv2.js @@ -0,0 +1,64 @@ +/* +Recursion and Dynamic Programming (4 steps) +1. start with the recursive backtracking solution (brute force) +2. Optimize by using a memoization table (top-down dynamic programming) +3. Remove the need for recursion (bottom-up dynamic programming) +4. Apply final tricks to reduce the time / memory complexity +*/ + +// Recursive Backtracking +// Time & Space O(n!) +function tripleStep(n, res=0) { + if (n < 0) return 0 + if (n === 0) return 1 + return tripleStep(n + 1) + tripleStep(n - 2) + tripleStep(n - 3) +} + +// Top Down Memoization +// Time & Space O(n) +function tripleStep(n, i=3, memo = [1, 1, 2, 4]) { + if (n < 0) return memo[0] + if (n === 1) return memo[n] + if (i > n ) return memo[memo.length - 1] + + memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] + return tripleStep(n, i+1, memo) +} + +// Bottom Up memoization +// Time & Space O(n) +function tripleStep(n, memo=[1,1,2,4]) { + for (let i = 3; i <= n; i++) { + memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] + } + + return memo[memo.length - 1] +} + +// Constant Space +// Time O(n) & Space O(1) +function tripleStep(n) { + if (n <= 0) return 0 + if (n === 1) return 1 + if (n === 2) return 2 + + let a = 1 + let b = 1 + let c = 2 + + for (let i = 3; i < n; i++) { + let d = a + b + c + a = b + b = c + c = d + } + return a + b + c +} + +/* TEST */ +console.log(tripleStep(1), 1); +console.log(tripleStep(2), 2); +console.log(tripleStep(3), 4); +console.log(tripleStep(5), 13) +console.log(tripleStep(7), 44) +console.log(tripleStep(10), 274); From 6b354dd8096cb926f712c9febbb2acbba792f8fb Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Sun, 28 Feb 2021 16:15:11 -0800 Subject: [PATCH 09/12] original and tripleStepv2 --- chapter08/8.01 - Triple Step/tripleStep.js | 77 +++++----------------- 1 file changed, 15 insertions(+), 62 deletions(-) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index cd6be38..63a71d1 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -1,65 +1,18 @@ -/* -Recursion and Dynamic Programming (4 steps) -1. Start with the recursive backtracking solution (Brute Force) -2. Optimize by using a memoization table (top-down dynamic programming) -3. Remove the need for recursion (bottom-up dynamic programming) -4. Apply final tricks to reduce the time / memory complexity -*/ - -// Recursive BackTracking -// Time & Space O(n!) -var tripleStep = function(n, res=0) { - if (n < 0) return 0 - if (n === 0) return 1 - return tripleStep(n - 1) + tripleStep(n - 2) + tripleStep(n - 3) -} - -// Top Down Memoization -// Time & Space O(n) -var tripleStep = function(n, i=3, memo = [1, 1, 2, 4]) { - if (n < 0) return memo[0] - if (n === 1) return memo[n] - if (i > n ) return memo[memo.length - 1] - - memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] - return tripleStep(n, i+1, memo) -} - -// Bottom Up memoization -// Time & Space O(n) -var tripleStep = function(n, memo=[1,1,2,4]) { - for (let i = 3; i <= n; i++) { - memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] +var numWays = function(N) { + var answer = 0 + var recurse = function(number) { + if (number === 0) { + answer++ + } else if (number > 0) { + recurse(number - 1) + recurse(number - 2) + recurse(number - 3) + } } - - return memo[memo.length - 1] + recurse(N) + return answer } -// Constant Space -// Time O(n) & Space O(1) -var tripleStep = function(n) { - if (n <= 0) return 0 - if (n === 1) return 1 - if (n === 2) return 2 - - let a = 1 - let b = 1 - let c = 2 - - for (let i = 3; i < n; i++) { - let d = a + b + c - a = b - b = c - c = d - } - return a + b + c -} - -/* TEST */ -console.log(tripleStep(1), 1); -console.log(tripleStep(2), 2); -console.log(tripleStep(3), 4); -console.log(tripleStep(5), 13) -console.log(tripleStep(7), 44) -console.log(tripleStep(10), 274); - +console.log(numWays(1), 1) +console.log(numWays(2), 2) +console.log(numWays(3), 4) From 2d4fb25a9899432962cf36bc96468496aa8931e7 Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Sun, 28 Feb 2021 16:16:28 -0800 Subject: [PATCH 10/12] formatted code --- chapter08/8.01 - Triple Step/tripleStep.js | 24 ++++----- chapter08/8.01 - Triple Step/tripleStepv2.js | 56 ++++++++++---------- 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index 63a71d1..60b38b0 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -1,18 +1,18 @@ var numWays = function(N) { - var answer = 0 + var answer = 0; var recurse = function(number) { if (number === 0) { - answer++ + answer++; } else if (number > 0) { - recurse(number - 1) - recurse(number - 2) - recurse(number - 3) + recurse(number - 1); + recurse(number - 2); + recurse(number - 3); } - } - recurse(N) - return answer -} + }; + recurse(N); + return answer; +}; -console.log(numWays(1), 1) -console.log(numWays(2), 2) -console.log(numWays(3), 4) +console.log(numWays(1), 1); +console.log(numWays(2), 2); +console.log(numWays(3), 4); diff --git a/chapter08/8.01 - Triple Step/tripleStepv2.js b/chapter08/8.01 - Triple Step/tripleStepv2.js index 3d10bcf..f694105 100644 --- a/chapter08/8.01 - Triple Step/tripleStepv2.js +++ b/chapter08/8.01 - Triple Step/tripleStepv2.js @@ -8,57 +8,57 @@ Recursion and Dynamic Programming (4 steps) // Recursive Backtracking // Time & Space O(n!) -function tripleStep(n, res=0) { - if (n < 0) return 0 - if (n === 0) return 1 - return tripleStep(n + 1) + tripleStep(n - 2) + tripleStep(n - 3) +function tripleStep(n, res = 0) { + if (n < 0) return 0; + if (n === 0) return 1; + return tripleStep(n + 1) + tripleStep(n - 2) + tripleStep(n - 3); } // Top Down Memoization // Time & Space O(n) -function tripleStep(n, i=3, memo = [1, 1, 2, 4]) { - if (n < 0) return memo[0] - if (n === 1) return memo[n] - if (i > n ) return memo[memo.length - 1] +function tripleStep(n, i = 3, memo = [1, 1, 2, 4]) { + if (n < 0) return memo[0]; + if (n === 1) return memo[n]; + if (i > n) return memo[memo.length - 1]; - memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] - return tripleStep(n, i+1, memo) + memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3]; + return tripleStep(n, i + 1, memo); } // Bottom Up memoization -// Time & Space O(n) -function tripleStep(n, memo=[1,1,2,4]) { +// Time & Space O(n) +function tripleStep(n, memo = [1, 1, 2, 4]) { for (let i = 3; i <= n; i++) { - memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3] + memo[i] = memo[i - 1] + memo[i - 2] + memo[i - 3]; } - return memo[memo.length - 1] + return memo[memo.length - 1]; } -// Constant Space +// Constant Space // Time O(n) & Space O(1) function tripleStep(n) { - if (n <= 0) return 0 - if (n === 1) return 1 - if (n === 2) return 2 + if (n <= 0) return 0; + if (n === 1) return 1; + if (n === 2) return 2; - let a = 1 - let b = 1 - let c = 2 + let a = 1; + let b = 1; + let c = 2; for (let i = 3; i < n; i++) { - let d = a + b + c - a = b - b = c - c = d + let d = a + b + c; + a = b; + b = c; + c = d; } - return a + b + c + return a + b + c; } /* TEST */ console.log(tripleStep(1), 1); console.log(tripleStep(2), 2); console.log(tripleStep(3), 4); -console.log(tripleStep(5), 13) -console.log(tripleStep(7), 44) +console.log(tripleStep(5), 13); +console.log(tripleStep(7), 44); console.log(tripleStep(10), 274); From 876f811565cdfd951ceaf17bde51613f60288616 Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Sun, 28 Feb 2021 16:17:58 -0800 Subject: [PATCH 11/12] added TEST comment --- chapter08/8.01 - Triple Step/tripleStep.js | 1 + 1 file changed, 1 insertion(+) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index 60b38b0..c0ba7b2 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -13,6 +13,7 @@ var numWays = function(N) { return answer; }; +/* TEST */ console.log(numWays(1), 1); console.log(numWays(2), 2); console.log(numWays(3), 4); From b1c471c629d790318e0b1a93bc561626976696a5 Mon Sep 17 00:00:00 2001 From: Carlos Green Date: Sun, 28 Feb 2021 16:19:13 -0800 Subject: [PATCH 12/12] added whitespace so both origin files are the same --- chapter08/8.01 - Triple Step/tripleStep.js | 1 + 1 file changed, 1 insertion(+) diff --git a/chapter08/8.01 - Triple Step/tripleStep.js b/chapter08/8.01 - Triple Step/tripleStep.js index c0ba7b2..12d1fa4 100644 --- a/chapter08/8.01 - Triple Step/tripleStep.js +++ b/chapter08/8.01 - Triple Step/tripleStep.js @@ -14,6 +14,7 @@ var numWays = function(N) { }; /* TEST */ + console.log(numWays(1), 1); console.log(numWays(2), 2); console.log(numWays(3), 4);