DP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public int minFallingPathSum(int[][] grid) { int n = grid.length;
for (int i = 1; i < n; i++) { for (int j = 0; j < n; j++) { int min = Integer.MAX_VALUE; for (int k = 0; k < n; k++) { if (k == j) { continue; } min = Math.min(min, grid[i - 1][k]); }
grid[i][j] += min; } }
int minPathSum = Integer.MAX_VALUE; for (int j = 0; j < n; j++) { minPathSum = Math.min(minPathSum, grid[n - 1][j]); } return minPathSum; } }
|
DP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class Solution { public int minFallingPathSum(int[][] grid) { int n = grid.length;
int firstMinIndex = -1, secondMinIndex = -1; for (int j = 0; j < n; j++) { int num = grid[0][j]; if (num < (firstMinIndex == -1 ? Integer.MAX_VALUE : grid[0][firstMinIndex])) { secondMinIndex = firstMinIndex; firstMinIndex = j; } else if (num < (secondMinIndex == -1 ? Integer.MAX_VALUE : grid[0][secondMinIndex])) { secondMinIndex = j; } }
for (int i = 1; i < n; i++) { int tempFirstMinIndex = -1, tempSecondMinIndex = -1; for (int j = 0; j < n; j++) { if (j == firstMinIndex) { grid[i][j] += grid[i - 1][secondMinIndex]; } else { grid[i][j] += grid[i - 1][firstMinIndex]; }
int num = grid[i][j]; if (num < (tempFirstMinIndex == -1 ? Integer.MAX_VALUE : grid[i][tempFirstMinIndex])) { tempSecondMinIndex = tempFirstMinIndex; tempFirstMinIndex = j; } else if (num < (tempSecondMinIndex == -1 ? Integer.MAX_VALUE : grid[i][tempSecondMinIndex])) { tempSecondMinIndex = j; } }
firstMinIndex = tempFirstMinIndex; secondMinIndex = tempSecondMinIndex; }
int minPathSum = Integer.MAX_VALUE; for (int j = 0; j < n; j++) { minPathSum = Math.min(minPathSum, grid[n - 1][j]); } return minPathSum; } }
|
References
1289. Minimum Falling Path Sum II