今日收获:不同路径,不同路径Ⅱ,整数拆分,不同的二叉搜索树
1. 不同路径
思路:dp数组记录到达(i,j)位置的路径数,初始化第一行和第一列为1(因为从起点到第一行或第一列的路径数均为1);遍历顺序是一层层从左到右遍历,递推公式是当前位置的路径数=左边位置路径数+上边位置的路径数。
方法:
class Solution {
public int uniquePaths(int m, int n) {
if (m==1||n==1){
return 1;
}
int[][] dp=new int[m][n]; // 到达第i,j个位置的路径数
// 初始化
for (int i=0;i<m;i++){
dp[i][0]=1;
}
for (int j=0;j<n;j++){
dp[0][j]=1;
}
// 遍历顺序,一层层从左到右遍历,因为到达(i,j)依赖于左边元素和上边的元素
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];
}
}
2. 不同路径Ⅱ
题目链接:63. 不同路径 II - 力扣(LeetCode)
思路:和上一题的思路大致相同,只是障碍位置的路径数为0;另外初始化时障碍及后面的位置都为0。
方法:
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m=obstacleGrid.length;
int n=obstacleGrid[0].length;
int[][] dp=new int[m][n]; // 到达第i,j个位置的路径数
// 起点或终点遇到了障碍
if (obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1){
return 0;
}
// 初始化,障碍前面的值都为1
for (int i=0;i<m&&obstacleGrid[i][0]==0;i++){
dp[i][0]=1;
}
for (int j=0;j<n&&obstacleGrid[0][j]==0;j++){
dp[0][j]=1;
}
// 遍历顺序,一层层从左到右遍历,因为到达(i,j)依赖于左边元素和上边的元素
for (int i=1;i<m;i++){
for (int j=1;j<n;j++){
if (obstacleGrid[i][j]==0){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}
总结:int基本数据类型的初始化值就为0,所以初始化时障碍后面的位置以及遍历时障碍的位置都不用管。
3. 整数拆分
思路:将整数拆分为尽可能相同的数累加
二刷一定可以啃下来!
4. 不同的二叉搜索树
题目链接:96. 不同的二叉搜索树 - 力扣(LeetCode)
二刷一定可以啃下来!