64. Minimum Path Sum-Leetcode

作者: analanxingde | 来源:发表于2018-01-19 09:29 被阅读2次

    算法思想

    与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]; 
    
        }
    };
    

    相关文章

      网友评论

        本文标题:64. Minimum Path Sum-Leetcode

        本文链接:https://www.haomeiwen.com/subject/jdxooxtx.html