62. Unique Paths
题目
分析:
机器人一共要走m+n-2步,现在举个例子类比,有一个m+n-2位的二进制数,现在要在其中的m位填0,其余各位填1,一共有C(m+n-2,m-1)种可能,如果0表示向下走,1表示向右走,这样就和题目意思一样了。
现在考虑最后一步的走法,要么向右走到达终点,要么向下走到达终点,因此
f(m,n) = f(m,n-1)+f(m-1,n);
代码如下(主要考虑的是大数据):
1 class Solution { 2 public: 3 int uniquePaths(int m, int n) { 4 vector<vector<int>> v(m, vector<int>(n, 1)); 5 for(int i=1; i<m; ++i){ 6 for(int j=1; j<n; ++j){ 7 v[i][j]=v[i-1][j]+v[i][j-1]; 8 } 9 } 10 return v[m-1][n-1]; 11 } 12 };
----------------------------------------------------------------------------分割线----------------------------------------------------------------------
63、Unique Paths II
题目
分析:这一题和62题的思路是一样,都是采用递推公式f(m,n) = f(m,n-1)+f(m-1,n);只不过在障碍处,f(m,n)=0
代码如下:
1 class Solution { 2 public: 3 int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { 4 int m = obstacleGrid.size(); 5 int n = obstacleGrid[0].size(); 6 vector<vector<int>> v(m, vector<int>(n, 0)); 7 for(int i=0;i<n;) 8 if(obstacleGrid[0][i] == 1) 9 { 10 11 while(i<n) 12 { 13 v[0][i] = 0; 14 i++; 15 } 16 } 17 else 18 { 19 v[0][i] = 1; 20 i++; 21 } 22 for(int i=0;i<m;) 23 if(obstacleGrid[i][0] == 1) 24 { 25 26 while(i<m) 27 { 28 v[i][0] = 0; 29 i++; 30 } 31 } 32 else 33 { 34 v[i][0] = 1; 35 i++; 36 } 37 for(int i=1; i<m; ++i){ 38 for(int j=1; j<n; ++j){ 39 if(obstacleGrid[i][j] == 1) 40 v[i][j] = 0; 41 else 42 v[i][j]=v[i-1][j]+v[i][j-1]; 43 } 44 } 45 return v[m-1][n-1]; 46 } 47 };
---------------------------------------------------------------------------------分割线-----------------------------------------------------------------
64. Minimum Path Sum
题目
分析:f(m,n) = min(f(m,n-1),f(m-1,n))+a[m][n]
代码如下
1 class Solution { 2 public: 3 int minPathSum(vector<vector<int>>& grid) { 4 int m = grid.size(); 5 int n = grid[0].size(); 6 vector<vector<int>> v(m, vector<int>(n, 0)); 7 int temp=0; 8 9 for(int i = 0;i<n;i++) 10 { 11 v[0][i] = temp + grid[0][i]; 12 temp = v[0][i]; 13 } 14 temp=0; 15 for(int i = 0;i<m;i++) 16 { 17 v[i][0] = temp + grid[i][0]; 18 temp = v[i][0]; 19 } 20 //v[0][0] = v[0][0]-grid[0][0]; 21 22 for(int i=1; i<m; ++i){ 23 for(int j=1; j<n; ++j){ 24 if(v[i-1][j]>v[i][j-1]) 25 temp = v[i][j-1]; 26 else 27 temp = v[i-1][j]; 28 29 v[i][j] = grid[i][j]+temp; 30 } 31 } 32 return v[m-1][n-1]; 33 } 34 35 };