1
var minFallingPathSum = function (grid) {2
if (grid.length === 1) {5
let sums = []; //find first, second and third minimum values in the grid as these are only possible values for path6
//store the index for fast lookup in a 3D array7
for (let i = 0; i < grid.length; i++) {8
let min = Math.min(...grid[i]);9
let idx = grid[i].indexOf(min);10
grid[i].splice(idx, 1, Infinity);11
let min2 = Math.min(...grid[i]);12
let idx2 = grid[i].indexOf(min2);13
grid[i].splice(idx2, 1, Infinity);14
let min3 = Math.min(...grid[i]);15
let idx3 = grid[i].indexOf(min3);22
// sums contains 1st , 2nd and 3rd min value and index23
let memo = {}; // for memoization24
let recur = (r, li) => {25
//recursive call to decide which path to choose from r=row, li=lastIndex26
if (memo[r + "," + li] !== undefined) {28
return memo[r + "," + li];30
if (r === grid.length - 1) {31
// last and first choice for path can only be from 1st and 2nd minimum, as there is only one other row to occupy these columns32
if (li === sums[r][0][1]) {33
memo[r + "," + li] = sums[r][1][0];35
memo[r + "," + li] = sums[r][0][0];37
return memo[r + "," + li];40
li // pick the minimum value path where index is not equal to last index43
memo[r + "," + li] = Math.min(44
sums[r][1][0] + recur(r + 1, sums[r][1][1]),45
sums[r][2][0] + recur(r + 1, sums[r][2][1])49
memo[r + "," + li] = Math.min(50
sums[r][0][0] + recur(r + 1, sums[r][0][1]),51
sums[r][2][0] + recur(r + 1, sums[r][2][1])55
memo[r + "," + li] = Math.min(56
sums[r][1][0] + recur(r + 1, sums[r][1][1]),57
sums[r][0][0] + recur(r + 1, sums[r][0][1])61
memo[r + "," + li] = Math.min(62
sums[r][0][0] + recur(r + 1, sums[r][0][1]),63
sums[r][1][0] + recur(r + 1, sums[r][1][1]),64
sums[r][2][0] + recur(r + 1, sums[r][2][1])67
return memo[r + "," + li];70
return recur(0, sums[0][2][1]); //since first and last can only be picked from 1st and 2nd min values