64. Minimum Path Sum

来源:互联网 发布:网络电商招商 编辑:程序博客网 时间:2024/06/06 20:16

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

Example 1:

[[1,3,1], [1,5,1], [4,2,1]]

Given the above grid map, return 7. Because the path 1→3→1→1→1 minimizes the sum.

使用动态规划的方式求解

java

class Solution {    public int minPathSum(int[][] grid) {        if (grid == null || grid.length == 0) {            return -1;        }        if (grid[0] == null || grid[0].length == 0) {            return -1;        }        int m = grid.length;        int n = grid[0].length;//         state        int[][] f = new int[m][n];//         initialize        f[0][0] = grid[0][0];        for (int i = 1; i < m; i++) {            f[i][0] = f[i - 1][0] + grid[i][0];        }        for (int j = 1; j < n; j++) {            f[0][j] = f[0][j - 1] + grid[0][j];        }//         function        for (int i = 1; i < m; i++) {            for (int j = 1; j < n; j++) {                f[i][j] = Math.min(f[i - 1][j], f[i][j - 1]) + grid[i][j];            }        }        return f[m - 1][n - 1];    }}
python

class Solution(object):    def minPathSum(self, grid):        """        :type grid: List[List[int]]        :rtype: int        """        if grid is None or len(grid) == 0:            return -1        if grid[0] is None or len(grid[0]) == 0:            return -1        res = []        m, n = len(grid), len(grid[0])        res.append([grid[0][0]])        for i in range(1, m):            val = grid[i][0] + res[i - 1][0]            res.append([val])        for j in range(1, n):            res[0].append(grid[0][j] + res[0][j - 1])        for  i in range(1, m):            for j in range(1, n):                res[i].append(min(res[i][j - 1], res[i - 1][j]) + grid[i][j])        return res[m - 1][n - 1]