现在的位置: 首页 > 综合 > 正文

leetcode Unique Paths & Unique Paths II & Minimum Path Sum

2019年04月01日 ⁄ 综合 ⁄ 共 1472字 ⁄ 字号 评论关闭

这三题都是简单的动态规划题目,Unique Paths其实结果是C(m+n-2,n-1),因为m.n 的值比较大时,不方便用求阶乘的方式直接求,容易溢出,所以,使用动态规划类似二项式拆解的方式进行求解

class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m<=1)return m;
        if(n<=1)return n;
        int map[m+1][n+1];
        memset(map,0,sizeof(map));
        for(int i=0;i<n;i++)map[0][i]=1;
        for(int i=0;i<m;i++)map[i][0]=1;
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++){
                map[i][j]=map[i-1][j]+map[i][j-1];
            }
        return map[m-1][n-1];
    }
};

Unique Paths II 在上一题的基础上加上了障碍,因此只要在上一题求解的基础上,对于障碍处通过绕开的计数方式即可

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
        int m=obstacleGrid.size();
        if(m==0)return 0;
        int n=obstacleGrid[0].size();
        if(n==0)return 0;
        int map[m+1][n+1];
        memset(map,0,sizeof(map));
        if(obstacleGrid[0][0]==1)return 0;
        
        map[0][0]=1;
        for(int i=1;i<n;i++){
               if(obstacleGrid[0][i]==1)
                     map[0][i]=0;
               else map[0][i]=map[0][i-1];
        }
        for(int i=1;i<m;i++){
               if(obstacleGrid[i][0]==1)
                     map[i][0]=0;
               else map[i][0]=map[i-1][0];
        }
        for(int i=1;i<m;i++)
            for(int j=1;j<n;j++){
                if(obstacleGrid[i][j]==0)
                map[i][j]=map[i-1][j]+map[i][j-1];
                else map[i][j]=0;
            }
        return map[m-1][n-1];
    }
};

Minimum Path Sum 则通过min res[i][j]=min(res[i-1][j],res[i][j-1])+map[i][j],其中map 为记录原始的值的矩阵,不断向下向右可得

class Solution {
public:
    int minPathSum(vector<vector<int> > &grid) {
        int len1=grid.size();
        if(len1==0)return 0;
        int len2=grid[0].size();
        for(int i=1;i<len1;i++)grid[i][0]+=grid[i-1][0];
        for(int i=1;i<len2;i++)grid[0][i]+=grid[0][i-1];
        for(int i=1;i<len1;i++){
            for(int j=1;j<len2;j++){
                if(grid[i-1][j]<grid[i][j-1])
                   grid[i][j]+=grid[i-1][j];
                 else
                    grid[i][j]+=grid[i][j-1];
            }
        }
        
    return grid[len1-1][len2-1];   
    }
};

抱歉!评论已关闭.