最小路径和(leetcode 64)

一:解题思路

这是一道经典的动态规划的题目。

方法一:定义初始转态和转态转移方程。

d[0][0]=a[0][0];对于一行:d[0][j]=d[0][j-1]+a[0][j];   对于第一列:d[i][0]=d[i-1][0]+a[i][0];

除了第一行和第一列之外的其他元素:d[i][j]=min(d[i-1][j],d[i][j-1])+a[i][j];

Time:O(m*n),Space:O(m*n)

方法二:

Time:O(m*n),Space:O(n)

二:完整代码示例 (C++版和Java版)

方法一C++:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) 
    {
        int m = grid.size();
        int n = grid[0].size();
        vector<vector<int>> d(m, vector<int>(n));
        d[0][0] = grid[0][0];
        for (int i = 1; i < m; i++)
            d[i][0] = d[i - 1][0] + grid[i][0];
        for (int j = 1; j < n; j++)
            d[0][j] = d[0][j - 1] + grid[0][j];

        for (int i = 1; i < m; i++)
        {
            for (int j = 1; j < n; j++)
                d[i][j] = min(d[i-1][j],d[i][j-1]) + grid[i][j];
        }

        return d[m-1][n-1];
    }
};

方法二C++:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) 
    {
        int m = grid.size(), n = grid[0].size();
        vector<int> d(n,-1);
        d[0] = grid[0][0];
        for (int j = 1; j < n; j++)
            d[j] = d[j - 1] + grid[0][j];
        for (int i = 1; i < m; i++)
        {
            d[0] += grid[i][0];
            for (int j = 1; j < n; j++)
                d[j] = min(d[j], d[j - 1]) + grid[i][j];
        }

        return d[n-1];
    }
};

方法一Java:

class Solution {
        public int minPathSum(int[][] grid)
        {
                int m=grid.length,n=grid[0].length;
                int[][] d=new int[m][n];
                d[0][0]=grid[0][0];
                for(int i=1;i<m;i++)
                    d[i][0]=d[i-1][0]+grid[i][0];
                for(int j=1;j<n;j++)
                    d[0][j]=d[0][j-1]+grid[0][j];

                for(int i=1;i<m;i++)
                {
                    for(int j=1;j<n;j++)
                    {
                        d[i][j]=Math.min(d[i-1][j],d[i][j-1])+grid[i][j];
                    }
                }

                return d[m-1][n-1];
        }
    }

 

方法二Java:

class Solution {
        public int minPathSum(int[][] grid) 
        {
               int m=grid.length,n=grid[0].length;
               int[] d=new int[n];
               d[0]=grid[0][0];
               for(int j=1;j<n;j++)
                   d[j]=d[j-1]+grid[0][j];
               for(int i=1;i<m;i++)
               {
                   d[0]+=grid[i][0];
                   for(int j=1;j<n;j++)
                       d[j]=Math.min(d[j],d[j-1])+grid[i][j];
               }
               
               return d[n-1];
        }
    }

 

方法一Python:

首先,需要知道一个知识点,在Python中,创建一个二维数组,是需要这样的写法:d= [[0] * cols for i in range(rows)],然后就可以按照C++中数组访问的方式去访问数组。例如,改变数组d的第一行,第一列的元素为1。d[0][0]=1。

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        m=len(grid)
        n=len(grid[0])

        d=[[0]*n for i in range(m)]
        d[0][0]=grid[0][0]

        for j in range(1,n):
            d[0][j]=d[0][j-1]+grid[0][j]

        for i in range(1,m):
            d[i][0]=d[i-1][0]+grid[i][0]

        for i in range(1,m):
            for j in range(1,n):
                d[i][j]=min(d[i-1][j],d[i][j-1])+grid[i][j]
        
        return d[m-1][n-1]

 

方法二Python:

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        m=len(grid)
        n=len(grid[0])

        d=[0]*n 
        d[0]=grid[0][0]
        for j in range(1,n):
            d[j]=d[j-1]+grid[0][j]
        
        for i in range(1,m):
            d[0]+=grid[i][0]
            for j in range(1,n):
                d[j]=min(d[j],d[j-1])+grid[i][j]

        return d[n-1]

 

posted @ 2020-04-07 20:10  repinkply  阅读(177)  评论(0)    收藏  举报