这三道题很像……都需要通过动态规划来解决。
一开始还想用backtrack穷举,然而超时惹……
62.
能够到达path[m-1][n-1]的路径数为能到达path[m-1][n-2]和path[m-2][n-1]的路径数之和
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> path(m,vector<int>(n,1));
for(int i=1;i<m;i++)
for(int j=1;j<n;j++){
path[i][j]=path[i-1][j]+path[i][j-1];
}
return path[m-1][n-1];
}
};
63.
在其中加入了obstacle,因此不能像上一题一样把初始值单纯都赋为1. 因为之后的双层循环需要从1开始(因为之后的操作中会出现i-1和j-1),因此需要对row和col为0的情况进行特殊处理赋值、
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int row=obstacleGrid.size();
int col=obstacleGrid[0].size();
vector<vector<int>> helper(row,vector<int>(col,0));
helper[0][0]=obstacleGrid[0][0]==1?0:1;
for(int i=1;i<row;i++) helper[i][0]=obstacleGrid[i][0]==1?0:helper[i-1][0];
for(int i=1;i<col;i++) helper[0][i]=obstacleGrid[0][i]==1?0:helper[0][i-1];
for(int i=1;i<row;i++)
for(int j=1;j<col;j++){
helper[i][j]=obstacleGrid[i][j]==1?0:helper[i-1][j]+helper[i][j-1];
}
return helper[row-1][col-1];
}
};
64.
很像……只不过是把找路径数改成了找最小路径和,依然要用动态规划的思想。minSum右下角最小的路径和等于它左边、上面最小路径和较小的那个值再加它自己的grid值。
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int row=grid.size();
int col=grid[0].size();
vector<vector<int>> minSum(row,vector<int>(col,0));
minSum[0][0]=grid[0][0];
for(int i=1;i<row;i++) minSum[i][0]=minSum[i-1][0]+grid[i][0];
for(int i=1;i<col;i++) minSum[0][i]=minSum[0][i-1]+grid[0][i];
for(int i=1;i<row;i++)
for(int j=1;j<col;j++){
minSum[i][j]=min(minSum[i-1][j],minSum[i][j-1])+grid[i][j];
}
return minSum[row-1][col-1];
}
};