64、最小路径和

题目:

解答:

简单dp。

定义:dpij为到达(i,j)所需要的最短路程

初始化:dp00=grid00,同时对第一行和第一列的,第i个就是前i个之和加上自身

递归:dpij=min(dpi-1j,dpij-1)+gridij,也就是从上面到达或者从左边到达

空间复杂度O(mn),m为grid行数,n为grid列数,作空间优化

vector<vector<int>> dp(m,vector<int>(2)) m行2列的vector 降低空间复杂度为m(这里也可以先写个if,判断m和n大小,来决定是m行2列还是m列2行,不影响时间复杂度)

按照一列一列来遍历,修改初始化条件,先初始化第一列,然后从第二列开始,dp01单独计算,dpj1按照上述递归式子的算法计算。一列遍历完成后,用dpm0=dpm1来存储状态,继续扫描下一列。最后return dpm-11即可

cpp 复制代码
class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size();
        if(n==1) {
            int ans = 0;
            for(int i=0;i<m;i++)    
                ans+=grid[i][0];
            return ans;
        }
        vector<vector<int>> dp(m,vector<int>(2));
        //dp[j][1]=min(dp[j][0],dp[j-1][1])+grid[j][i]
        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 i=1;i<n;i++){
            for(int j=0;j<m;j++){
                if(j==0)
                    dp[j][1]=grid[j][i]+dp[j][0];
                else
                    dp[j][1]=min(dp[j-1][1],dp[j][0])+grid[j][i];  
            }
            for(int j=0;j<m;j++)
                dp[j][0]=dp[j][1];
        }
        return dp[m-1][1];
    }
};

时间复杂度O(mn)

空间复杂度O(m)

相关推荐
yi01125 分钟前
DAY17: LeetCode 139|单词拆分:从“把单词删掉”到用 DP 记录合法切口
人工智能·笔记·python·算法·leetcode·动态规划
陈希瑞38 分钟前
LongCat-2.5-Preview 的web逆向能力实测
人工智能·算法·wasm
tangguofeng2 小时前
基于分治策略的循环赛日程表问题的思路讲解
算法
起个名字费劲死了2 小时前
VisionMaster集成深度学习算法(基础狗)
人工智能·深度学习·算法
lengxuenong2 小时前
枚举例题分析
c++·算法·青少年编程
Navigator_Z3 小时前
LeetCode //C - 1269. Number of Ways to Stay in the Same Place After Some Steps
c语言·算法·leetcode
2601_965742223 小时前
短视频脚本创作方法分享:本地生活类账号的起步思路
大数据·人工智能·算法·ai·新媒体运营·生活
55873生态系统手记3 小时前
读完 55873 资产钱包的技术栈,我重新理解了 "合规钱包" 应该长什么样
算法·架构
旋生万物3 小时前
素数螺旋映射 $z_n=n^{1+i}$ 的角分布统计检验与零模型对比
大数据·前端·人工智能·算法·云原生·螺旋生成论·螺旋相位
HRTOS3 小时前
HRTOS Shell继续完善:优化printf缓冲区与字符串越界保护,国庆后随新版本更新
运维·单片机·嵌入式硬件·算法·51单片机