代码随想录算法训练营第三十九天| 62.不同路径 63. 不同路径 II

文章目录

  • 62.不同路径
    • 思路
    • 代码
    • 总结
  • 63. 不同路径 II
    • 思路
    • 代码
    • 总结

62.不同路径

思路

初始化分析很重要

代码

自己写的第一版

class Solution {
public:
   int uniquePaths(int m, int n) {
       // dp[i,j]: 到达[i,j]有多少种方法
       // dp[m,n] = dp[m-1,n] + dp[m,n-1];
       // dp[0,0] = 1;...
       if(m <= 1 && n <= 1) return 1;

       vector<vector<int>> dp (m+1, vector<int>(n+1));
       for(int i = 0; i < m+1; i++) dp[i][0] = 0;
       for(int j = 0; j < n+1; j++) dp[0][j] = 0;

       // dp[1][1] = 1;
       dp[0][1] = 1;
       for(int i = 1; i < m+1; i++) {
           for(int j = 1; j < n+1; j++) {
               dp[i][j] = dp[i-1][j] + dp[i][j-1];
           }
       }
       for(int i = 1; i < m+1; i++) {
           for(int j = 1; j < n+1; j++) {
               cout << dp[i][j] <<" ";
           }
           cout << endl;
       }
       return dp[m][n];
   }
};

题解的代码设置的dp数组维度是[m,n],我的是[m+1,n+1]

总结

  1. 组合数学方法里处理溢出的代码比较复杂

63. 不同路径 II

思路

判断有无障碍 – 有障碍的话,经过这个节点的路径截断

代码

自己写的版本

class Solution {
public:
   int uniquePaths(int m, int n) {
       // dp[i,j]: 到达[i,j]有多少种方法
       // dp[m,n] = dp[m-1,n] + dp[m,n-1];
       // dp[0,0] = 1;...
       if(m <= 1 && n <= 1) return 1;

       vector<vector<int>> dp (m+1, vector<int>(n+1));
       for(int i = 0; i < m+1; i++) dp[i][0] = 0;
       for(int j = 0; j < n+1; j++) dp[0][j] = 0;

       // dp[1][1] = 1;
       dp[0][1] = 1;
       for(int i = 1; i < m+1; i++) {
           for(int j = 1; j < n+1; j++) {
               dp[i][j] = dp[i-1][j] + dp[i][j-1];
           }
       }
       for(int i = 1; i < m+1; i++) {
           for(int j = 1; j < n+1; j++) {
               cout << dp[i][j] <<" ";
           }
           cout << endl;
       }
       return dp[m][n];
   }
};

题解的代码思路是:障碍后的路径保持初始状态0,障碍前的路径正常初始化

总结

  1. 空间优化版本的代码是使用了滚动数组

你可能感兴趣的:(代码随想录训练营,算法,leetcode,c++)