64 minimum sum path寻找路径和最小

递推

class Solution {
    public int minPathSum(int[][] grid) {
        int row = grid.length;
        if(row == 0)    return -1;
        int col = grid[0].length;
        if(row==1 && col==1)    return grid[0][0];
        int[][] sum = new int[row][col];
        sum[0][0]=grid[0][0];
        for(int i = 1; i<col ; i++) sum[0][i] = grid[0][i]+sum[0][i-1];
        for(int i = 1; i<row ; i++) sum[i][0] = grid[i][0]+sum[i-1][0];
        for(int i = 1 ; i < row ; i++){
            for(int j = 1 ; j < col ; j++){
                sum[i][j]=Math.min(sum[i-1][j],sum[i][j-1])+grid[i][j];
            }
        }
        return sum[row-1][col-1];
    }
}

记忆+递归

class Solution {
    public int minPathSum(int[][] grid) {
        int[][] memo = new int[grid.length][grid[0].length];
        for (int i=0; i<grid.length; i++) {
            Arrays.fill(memo[i], -1);
        }
        
        return dfs(grid, 0, 0, memo);
    }
    int dfs(int[][] grid, int i, int j, int[][] memo) {
        int m = grid.length, n = grid[0].length;
        if (i < 0 || i >= m || j < 0 || j >= n) return Integer.MAX_VALUE;
        if (i == m - 1 && j == n - 1) return grid[i][j];
        
        if (memo[i][j] != -1) {
            return memo[i][j];
        }
        
        int bottom = dfs(grid, i+1, j, memo);
        int right = dfs(grid, i, j+1, memo);
        
        memo[i][j] = grid[i][j] + Math.min(bottom, right);
        
        return memo[i][j];
    }
}

猜你喜欢

转载自blog.csdn.net/better_girl/article/details/83310292