343. 整数拆分
关键点1:优化点:因为两个数相近相乘的结果比较大,所以j只到i/2就行了,不用到i;
关键点2:求这三种情况的最大值:拆分成两个数相乘,拆分成多个数相乘,以及原始的dp[i];
class Solution {
public int integerBreak(int n) {
int[] dp = new int[n+1];
dp[2] = 1;
for(int i = 3;i <= n;i++){
for(int j =1;j<=i/2;j++){
dp[i] = Math.max(dp[i],Math.max(j*(i-j),j*dp[i-j]));
}
}
return dp[n];
}
}
96.不同的二叉搜索树
关键点1:dp数组中dp[i]代表i个节点有多少种二叉搜索树;初始化,0个节点的二叉搜索树是1;
关键点2:dp[i] 为j从1-i之间循环,左边的节点数的二叉搜索树的种类*右边的节点数的二叉搜索树的种类的循环求和。
class Solution {
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[j-1] * dp[i-j];
}
}
return dp[n];
}
}