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

    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,881评论 0 33
  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,631评论 0 18
  • (欢迎转载,但请注明出处并附带链接)算法好久没复习了,今天看见一妹子在办公室刷Leetcode,顿时我也来了兴趣,...
    Nick_Zuo阅读 738评论 0 3
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 18,364评论 2 36
  • 今天继续读《历史的教训》第五章 性格与历史。杜兰特在这章指出构成社会的基础是人性。人性的构成可以改写国家的构成。作...
    入定阅读 159评论 0 0

友情链接更多精彩内容