leetcode 64. Minimum Path Sum (简单 DP)

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:

Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.

  • 思路:动态规划

空间 O(n2)O(n^2)

C++

class Solution {
public:
    int minPathSum(vector<vector<int>>& a) {
        int m=a.size(),n=a[0].size();
        vector<vector<int>> f(m,vector<int>(n,INT_MAX));
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                if(!i&&!j)f[i][j]=a[i][j];
                else{
                    if(i>0)f[i][j]=min(f[i][j],f[i-1][j]+a[i][j]);
                    if(j>0)f[i][j]=min(f[i][j],f[i][j-1]+a[i][j]);
                }
            }
        return f[m-1][n-1];
    }
};

Java

  • 这个实现修改了输入,emmm 空间算是 O(1)O(1)
class Solution {
    public int minPathSum(int[][] a) {
        int m=a.length,n=a[0].length;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                if(i>0&&j==0)a[i][j]+=a[i-1][j];
                if(j>0&&i==0)a[i][j]+=a[i][j-1];
                if(j>0&&i>0)
                    a[i][j]+=Math.min(a[i-1][j],a[i][j-1]);
            }
        return a[m-1][n-1];
    }
}

Python

class Solution:
    def minPathSum(self, a: List[List[int]]) -> int:
        m=len(a)
        n=len(a[0])
        for i in range(m):
            for j in range(n):
                if i>0 and j==0:
                    a[i][j]+=a[i-1][j]
                if j>0 and i==0:
                    a[i][j]+=a[i][j-1]
                if i>0 and j>0:
                    a[i][j]+=min(a[i][j-1],a[i-1][j])
        return a[m-1][n-1]

Go

func minPathSum(a [][]int) int {
    m:=len(a)
    n:=len(a[0])
    for i:=0; i<m; i++{
        for j:=0; j<n; j++{
            if i>0 && j==0{
                a[i][j]+=a[i-1][j]
            }
            if j>0 && i==0{
                a[i][j]+=a[i][j-1]
            }
            if i>0 && j>0{
                a[i][j]+=min(a[i][j-1],a[i-1][j])
            }
        }
    }
    return a[m-1][n-1]
}

func min(a, b int)int{
    if a < b {
        return a
    }
    return b
}

空间 O(n)O(n)

C++

class Solution {
public:
    int minPathSum(vector<vector<int>>& a) {
        int m=a.size(),n=a[0].size();
        vector<int> f(n,INT_MAX);
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                if(!i&&!j)f[j]=a[i][j];
                else{
                    if(i>0&&!j)f[j]=f[j]+a[i][j];
                    if(j>0&&!i)f[j]=f[j-1]+a[i][j];
                    if(i>0&&j>0)f[j]=min(f[j],f[j-1])+a[i][j];
                }
            }
        return f[n-1];
    }
};

Java

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

Python

class Solution:
    def minPathSum(self, a: List[List[int]]) -> int:
        m=len(a)
        n=len(a[0])
        f=[0]*n
        f[0]=a[0][0]
        for i in range(m):
            for j in range(n):
                if i>0 and j==0:
                    f[j]=a[i][j]+f[j]
                if j>0 and i==0:
                    f[j]=a[i][j]+f[j-1]
                if i>0 and j>0:
                    f[j]=min(f[j-1],f[j])+a[i][j]
        return f[n-1]

Go

func minPathSum(a [][]int) int {
    m:=len(a)
    n:=len(a[0])
    f:=make([]int,n)
    f[0]=a[0][0]
    for i:=0; i<m; i++{
        for j:=0; j<n; j++{
            if i>0 && j==0{
                f[j]=a[i][j]+f[j]
            }
            if j>0 && i==0{
                f[j]=a[i][j]+f[j-1]
            }
            if i>0 && j>0{
                f[j]=a[i][j]+min(f[j-1],f[j])
            }
        }
    }
    return f[n-1]
}

func min(a, b int)int{
    if a < b {
        return a
    }
    return b
}
posted @ 2020-08-13 09:28  winechord  阅读(106)  评论(0编辑  收藏  举报