题目

image.png

思路

  • 不同路径差不多,不多说

    代码

    1. //1.暴力递归
    2. public int minPathSum(int[][] grid) {
    3. return recur(grid, grid.length - 1, grid[0].length - 1);
    4. }
    5. public int recur(int[][] grid, int i, int j) {
    6. if (i == 0 && j == 0) return grid[i][j];
    7. if (i < 0 || j < 0) return Integer.MAX_VALUE;
    8. return Math.min(recur(grid, i - 1, j), recur(grid, i, j - 1)) + grid[i][j];
    9. }
    10. //2.备忘录
    11. int[][] dp;
    12. public int minPathSum(int[][] grid) {
    13. dp = new int[grid.length][grid[0].length];
    14. return recur(grid, grid.length - 1, grid[0].length - 1);
    15. }
    16. public int recur(int[][] grid, int i, int j) {
    17. if (i == 0 && j == 0) return grid[i][j];
    18. if (i < 0 || j < 0) return Integer.MAX_VALUE;
    19. if (dp[i][j] != 0) return dp[i][j];
    20. dp[i][j] = Math.min(recur(grid, i - 1, j), recur(grid, i, j - 1)) + grid[i][j];
    21. return dp[i][j];
    22. }
    23. //3.动态规划
    24. public int minPathSum(int[][] grid) {
    25. if (grid.length == 0) return 0;
    26. int[][] dp = new int[grid.length][grid[0].length];
    27. dp[0][0] = grid[0][0];
    28. for (int i = 1; i < grid.length; i++) {
    29. dp[i][0] += dp[i - 1][0] + grid[i][0];
    30. }
    31. for (int j = 1; j < grid[0].length; j++) {
    32. dp[0][j] += dp[0][j - 1] + grid[0][j];
    33. }
    34. for (int i = 1; i < grid.length; i++) {
    35. for (int j = 1; j < grid[0].length; j++) {
    36. dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
    37. }
    38. }
    39. return dp[grid.length - 1][grid[0].length - 1];
    40. }
    41. //4.动态规划,优化dp数组
    42. public int minPathSum(int[][] grid) {
    43. if (grid.length == 0) return 0;
    44. int[] dp = new int[grid[0].length];
    45. dp[0] = grid[0][0];
    46. for (int j = 1; j < grid[0].length; j++) {
    47. dp[j] += dp[j - 1] + grid[0][j];
    48. }
    49. for (int i = 1; i < grid.length; i++) {
    50. dp[0] += grid[i][0];
    51. for (int j = 1; j < grid[0].length; j++) {
    52. dp[j] = Math.min(dp[j], dp[j - 1]) + grid[i][j];
    53. }
    54. }
    55. return dp[grid[0].length - 1];
    56. }

    最小路径和