64. Minimum Path Sum-Leetcode

算法思想

与62,63题很相似,只需要维护一个一维数组,每次更新一维数组的值时进行运算dp[j]=min(dp[j-1],dp[j])+grid[i][j-1]即可,但是需要注意事先对边界值的处理

我的解法

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m=grid.size();
        int n=grid[0].size();
        vector<int> dp(n+1,0);
        //dp[1]=grid[0][0]; 因为下续循环中i==0时会对此值进行重新的计算
        for(int i=0;i<m;i++)
            for (int j=1;j<=n;j++)
            {
                if(i==0)
                    dp[j]=dp[j-1]+grid[i][j-1];
                if(j==1 &&i!=0)    //最左边一列的边缘处理,i!=0是为了去除左上节点背运算两次
                    dp[j]=dp[j]+grid[i][j-1];
                else
                    dp[j]=min(dp[j-1],dp[j])+grid[i][j-1];
            }
        return dp.back();   
    }
};

最优解法

推荐的最快时间算法在空间复杂度上不足,与本解法的时间差在于对边界值处理时在一维循环里会快于二维循环,因此也可以对我的解法进行时间上的优化处理。

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

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

    }
};
    原文作者:analanxingde
    原文地址: https://www.jianshu.com/p/de3bb1c27edc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞