leetcode-zgd-day39-62.不同路径/63.不同路径II(附带dp数组降维)

93 阅读2分钟

62.不同路径

题目链接:62. 不同路径 - 力扣(LeetCode)

解题思路:

 class Solution {
     public int uniquePaths(int m, int n) {
         /**
          * 1.确定dp数组及其下标含义 dp[i][j] 到达下标i,j有多少种方案
          * 2.递推关系式 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
          * 3.初始化 dp[0][j] = 1  dp[i][0] = 1
          * 4.循环顺序 正向循环即可
          */
         int[][] dp = new int[m][n];
         for(int i = 0; i < m; i++){
             dp[i][0] = 1;
         }
         for(int j = 0; j < n; j++){
             dp[0][j] = 1;
         }
         for(int i = 1; i < m; i++){
             for(int j = 1; j < n; j++){
                 dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
             }
         }
         return dp[m - 1][n - 1];
     }
 }

降维降维!!!!

 class Solution {
     public int uniquePaths(int m, int n) {
         /**
          * 尝试数组降维
          * 1.确定dp数组及其下标含义 dp[i] 到达下标i,j有多少种方案
          * 2.递推关系式 dp[i] = dp[i - 1] + dp[i]
          * 3.初始化 dp[i] = 1
          * 4.循环顺序 正向循环即可
          */
         int[] dp = new int[n];
         for(int i = 0; i < n; i++){
             dp[i] = 1;
         }
         for(int i = 1; i < m; i++){
             for(int j = 1; j < n; j++){
                 dp[j] = dp[j - 1] + dp[j];
             }
         }
         return dp[n - 1];
     }
 }

63.不同路径II

题目链接:63. 不同路径 II - 力扣(LeetCode)

解题思路:

 class Solution {
     public int uniquePathsWithObstacles(int[][] obstacleGrid) {
         /**
          * 1.确定dp数组及其下标含义 dp[i][j] 到i,j有多少种方案
          * 2.递推关系式:
          * if(ob == 1) dp[i][j] = 0
          * dp[i][j] = dp[i][j - 1] + dp[i - 1][j]
          * 3.初始化 dp[i][0] = 1 dp[0][j] = 1 除非碰到障碍物  后续都为0
          * 4.循环顺序 正向循环即可
          */
         int[][] dp = new int[obstacleGrid.length][obstacleGrid[0].length];
         for(int i = 0; i < obstacleGrid.length; i++){
             if(obstacleGrid[i][0] == 1) break;
             dp[i][0] = 1;
         }
         for(int i = 0; i < obstacleGrid[0].length; i++){
             if(obstacleGrid[0][i] == 1) break;
             dp[0][i] = 1;
         }
         for(int i = 1; i < obstacleGrid.length; i++){
             for(int j = 1; j < obstacleGrid[0].length; j++){
                 if(obstacleGrid[i][j] == 1) dp[i][j] = 0;
                 else dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
             }
         }
         return dp[obstacleGrid.length - 1][obstacleGrid[0].length - 1];
     }
 }

这个题也可以降维,只不过另外一个维度的初始化需要在递推维护数组的时候来完成

 class Solution {
     public int uniquePathsWithObstacles(int[][] obstacleGrid) {
         /**
          * 尝试降维
          * 1.确定dp数组及其下标含义 dp[i]
          * 2.递推关系式:
          * if(ob == 1) dp[i] = 0
          * dp[i] = dp[i] + dp[i - 1]
          * 3.初始化 dp[i] = 1  除非碰到障碍物  后续都为0
          * 递推的时候每次外层for循环开始的时候,都需要判断一下当前行第一个是否为障碍物,属于初始化的一部分
          * 4.循环顺序 正向循环即可
          */
         int[] dp = new int[obstacleGrid[0].length];
         for(int i = 0; i < obstacleGrid[0].length; i++){
             if(obstacleGrid[0][i] == 1) break;
             dp[i] = 1;
         }
         for(int i = 1; i < obstacleGrid.length; i++){
             if(obstacleGrid[i][0] == 1) dp[0] = 0;
             for(int j = 1; j < obstacleGrid[0].length; j++){
                 if(obstacleGrid[i][j] == 1) dp[j] = 0;
                 else dp[j] = dp[j - 1] + dp[j];
             }
         }
         return dp[obstacleGrid[0].length - 1];
     }
 }