不同路径
public int uniquePaths(int m, int n) {
if(m==1||n==1)return 1;
int [][]dp=new int[m][n];
for(int i=0;i<m;i++)dp[i][0]=1;
for(int i=0;i<n;i++)dp[0][i]=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];
}
不同路径II
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m=obstacleGrid.length;
int n=obstacleGrid[0].length;
int [][]dp=new int[m][n];
int flag1=0,flag2=0;
for(int i=0;i<m;i++){
if(obstacleGrid[i][0]==1||flag1==1){
dp[i][0]=0;
flag1=1;
}else{
dp[i][0]=1;
}
}
for(int i=0;i<n;i++){
if(obstacleGrid[0][i]==1||flag2==1){
dp[0][i]=0;
flag2=1;
}else{
dp[0][i]=1;
}
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(obstacleGrid[i][j]==1){
dp[i][j]=0;
}else{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
整数拆分
public int integerBreak(int n) {
if(n==2)return 1;
if(n==3)return 2;
int k=n/3;
int res=1;
for(int i=0;i<k;i++){
res*=3;
}
if(n%3==0){
return res;
}
if(n%3==2){
return res*2;
}
return res/3*4;
}
这道题我是总结的数学规律
当因数都为3时乘积最大,如果不能被3整除,就多分出一个2,或分出两个2来相乘
不同的二叉搜索树
public int numTrees(int n) {
int []dp=new int[n+1];
dp[0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
dp[i]+=dp[i-j]*dp[j-1];
}
}
return dp[n];
}