64、最小路径和

题目:

解答:

简单dp。

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

初始化:dp[0][0]=grid[0][0],同时对第一行和第一列的,第i个就是前i个之和加上自身

递归:dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j],也就是从上面到达或者从左边到达

空间复杂度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行,不影响时间复杂度)

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

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)

相关推荐
无极低码2 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发3 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre3 小时前
22 括号生成
算法·深度优先
努力也学不会java4 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎5 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan5 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业6 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe6 小时前
C++并发编程中的死锁避免
开发语言·c++·算法
C羊驼6 小时前
C语言:两天打鱼,三天晒网
c语言·经验分享·笔记·算法·青少年编程
菜菜小狗的学习笔记6 小时前
剑指Offer算法题(四)链表
数据结构·算法·链表