62.不同路径
解题思路:
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];
}
}