力扣 64.最小路径和 Minimum Path Sum

动态规划题一直是我的弱项,这道题之前应该是遇到过,但那时自己想不出来,就看了看题解,没有做。今天力扣的每日一题又遇到了,正好做一下。

力扣 64.最小路径和 Minimum Path Sum   难度:中等

        算是比较简单的动规题,f[i][j]=min(f[i][j-1],f[i-1][j]),(边界情况要特殊考虑)

  空间复杂度优化,每次只存储上一行的dp值,于是用一维的f就可以了。(这种方法应该也是之前在什么地方看题解看到的,不然我自己肯定想不出来)。

  自己写的代码如下,一开始在用第一行对f[i]进行初始化时忘记加上前一项f[i-1]了,就直接f[i]=grid[0][i],导致第一次运行不对,后来修改了之后过了。

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int row=grid.size(),col=grid[0].size();
        vector<int> f(col,0);//每一列最小值
        int i,j;
        f[0]=grid[0][0];
        for(i=1;i<col;i++)
        {
            f[i]=grid[0][i]+f[i-1];//到达第一行的各点,只能从左边来
        }    
        for(i=1;i<row;i++)
        {
            for(j=0;j<col;j++)
            {
                if(j==0)
                {
                    f[j]=f[j]+grid[i][j];//相当于从上走到[i,j]处的路径和
                    continue;
                }
                f[j]=grid[i][j]+min(f[j],f[j-1]);//选择上方和左侧的最小值,加上当前值
            }
        }
        return f[col-1];
    }
};

 对照了一下官方的题解,前面还需要加一个对grid.size()为0、或grid[0].size()为0的判断。

猜你喜欢

转载自www.cnblogs.com/forest-stream/p/13366764.html
今日推荐