343. 整数拆分
思路
动态规划的思想,根据前一个数的结果判断当前数。如果
前一个数中有3,升级成4
如果有1,升级成2
如果有2,升级成3
思路代码
func integerBreak(n int) int {
res:=1
for i:=3;i<=n;i++{
if res%2==0&&i>4{
res=res/2*3
}else if res%3==0{
res=res/3*4
}else{
res=res*2
}
}
return res
}
代码
func integerBreak(n int) int {
/**
动态五部曲
1.确定dp下标及其含义
2.确定递推公式
3.确定dp初始化
4.确定遍历顺序
5.打印dp
**/
dp := make([]int, n+1)
dp[1] = 1
dp[2] = 1
for i := 3; i < n+1; i++ {
for j := 1; j < i-1; j++ {
// i可以差分为i-j和j。由于需要最大值,故需要通过j遍历所有存在的值,取其中最大的值作为当前i的最大值,在求最大值的时候,一个是j与i-j相乘,一个是j与dp[i-j].
dp[i] = max(dp[i], max(j*(i-j), j*dp[i-j]))
}
}
return dp[n]
}
func max(a, b int) int{
if a > b {
return a
}
return b
}
困难
我的解法更像是贪心的思路。
96.不同的二叉搜索树
官方题解
代码
func numTrees(n int) int {
dp:=make([]int,n+1)
dp[0]=1
for i:=1;i<=n;i++{
for j:=0;j<=i-1;j++{
dp[i]+=dp[j]*dp[i-1-j]
}
}
return dp[n]
}
困难
当1为头结点的时候,其右子树有两个节点,看这两个节点的布局,是不是和 n 为2的时候两棵树的布局是一样的啊!
(可能有同学问了,这布局不一样啊,节点数值都不一样。别忘了我们就是求不同树的数量,并不用把搜索树都列出来,所以不用关心其具体数值的差异)
当3为头结点的时候,其左子树有两个节点,看这两个节点的布局,是不是和n为2的时候两棵树的布局也是一样的啊!
当2为头结点的时候,其左右子树都只有一个节点,布局是不是和n为1的时候只有一棵树的布局也是一样的啊!
今日收获
需要之前所有dp值共同判断的动态规划。