leetcode63. 不同路径 II(动态规划-java)

不同路径 II

  • leetcode63. 不同路径 II
    • 题目描述
    • 暴力递归
    • 代码演示
    • 动态规划
      • 代码演示
    • 动态规划空间压缩
  • 动态规划专题

leetcode63. 不同路径 II

题目描述

暴力递归

代码演示

/**
* 主方法
*/public int uniquePathsWithObstacles(int[][] obstacleGrid) {//如果右下角是障碍物,怎么都过不去,直接返回0if(obstacleGrid[obstacleGrid.length - 1][obstacleGrid[0].length - 1] == 1){return 0;}//开始递归return process(obstacleGrid,0,0);}/*** 暴力递归* i 和 j 描述当前在的位置*/public int process(int[][]obstacleGrid,int i,int j){//base case 来到最后一个位置,前面路线有效,返回1if(i == obstacleGrid.length - 1 && j == obstacleGrid[0].length - 1 ){return 1;}//越界,路线无效 返回0if(i >= obstacleGrid.length || j >= obstacleGrid[0].length){return 0;}// 碰到障碍物,无效返回0if(obstacleGrid[i][j] == 1){return 0;}//x向下和向右两种情况int down = process(obstacleGrid,i + 1,j);int right = process(obstacleGrid,i,j + 1);//两种情况累加就是所有的路线return down + right;}

动态规划

代码演示

  /*** 动态规划* @param obstacleGrid* @return*/public int uniquePathsWithObstacles(int[][] obstacleGrid) {int n = obstacleGrid.length;int m = obstacleGrid[0].length;//最有下角如果是障碍物,就无法过去,返回 0if (obstacleGrid[n - 1][m - 1] == 1) {return 0;}//动态规划表int[][]dp = new int[n][m];//来标记最后一行最后一次出现障碍物的位置int flagN = -1;//来标记最后一列最后一次出现障碍物的位置int flagM = -1;for (int i = m - 1; i >= 0;i--){if(obstacleGrid[n - 1][i] == 1){flagN = i;break;}}//最后一个障碍物之后的位置初始化为1for (int i = flagN + 1; i < m;i++){dp[n - 1][i] = 1;}//标记最后一列最后一次出现障碍物的位置.for (int j =  n - 1; j >= 0;j--){if(obstacleGrid[j][m - 1] == 1){flagM = j;break;}}//最后一个障碍物之后的位置初始化为1for (int j = flagM + 1; j < n;j++){dp[j][m - 1] = 1;}for (int i = n - 2;i >= 0;i--){for (int j = m - 2;j >= 0;j--){//当前位置本身是障碍物 即为0if(obstacleGrid[i][j] == 1){dp[i][j] = 0;}else{//z状态转移方程dp[i][j] = dp[i + 1][j] + dp[i][j + 1];}}}return dp[0][0];}

动态规划空间压缩

  /*** 动态规划 + 空间压缩* @param obstacleGrid* @return*/public int uniquePathsWithObstacles2(int[][] obstacleGrid) {int n = obstacleGrid.length;int m = obstacleGrid[0].length;if (obstacleGrid[n - 1][m - 1] == 1) {return 0;}int[]dp = new int[m];int flagN = -1;for (int i = m - 1; i >= 0;i--){if(obstacleGrid[n - 1][i] == 1){flagN = i;break;}}for (int i = flagN + 1; i < m;i++){dp[i] = 1;}int flagM = -1;for (int j =  n - 1; j >= 0;j--){if(obstacleGrid[j][m - 1] == 1){flagM = j;break;}}for (int i = n - 2;i >= 0;i--){dp[m - 1] = i > flagM ? 1 : 0;for (int j = m - 2;j >= 0;j--){if(obstacleGrid[i][j] == 1){dp[j] = 0;}else{dp[j] = dp[j] + dp[j + 1];}}}return dp[0];}

动态规划专题

leetcode62. 不同路径

leetcode877. 石子游戏

leetcode64. 最小路径和

leetcode416. 分割等和子集

leetcode354. 俄罗斯套娃信封问题

leetcode300. 最长递增子序列

leetcode337. 打家劫舍 III

本文链接:https://my.lmcjl.com/post/13970.html

展开阅读全文

4 评论

留下您的评论.