classSolution { publicintminFallingPathSum(int[][] matrix) { intmin= Integer.MAX_VALUE; // 可以从第一行的任意一列出发 for (inti=0; i < matrix[0].length; i++) { min = Math.min(min, dp(matrix, matrix.length - 1, i)); } return min; }
publicintdp(int[][] matrix, int i, int j) { // 上一个节点的位置放置数组越界,给出一个大于可能值的值,让他在getMin的时候被过滤掉 if (i < 0 || j < 0 || i >= matrix.length || j >= matrix[0].length ) { return99999; } // base case if (i == 0) { return matrix[i][j]; }
// 灵魂所在,第0行任意一列移动到第i行第j列的最小路径和等于第i-1行中能到达第i行j列的最小值加上matrix[i][j] return getMin(dp(matrix, i - 1, j), dp(matrix, i - 1, j + 1), dp(matrix, i - 1, j - 1)) + matrix[i][j]; }
publicintgetMin(int left, int down, int right) { intmin= Math.min(left, down); return Math.min(min, right); } }