代码随想录算法训练营 day 41: ● 343. 整数拆分 ● 96.不同的二叉搜索树

61 阅读1分钟

343. Integer Break

整数拆分的思路就是对给定整数i, 以j遍历,乘积最大值为dp[j] * (i-j) 或者 (i-j) * j,取最大值即可。 对于每个dp[i]的计算都要遍历从1到i,但超过 i/2就不可能有更好的结果,所以也可以只遍历到i/2

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(dp[i-j] * j, (i-j) * j));
            }
        }

        return dp[n];
        
    }
}

96. Unique Binary Search Trees 二叉搜索树的唯一结构数。 子问题就是如果已经有dp[i-1],即i-1个元素的二叉搜索树集合,如何推dp[i] 可以用根节点为j来遍历。根节点为j时,左子树有j-1个元素,右子树有i-j个元素,所以根节点为j的BST数目为dp[j-1] * dp[i-j]。 将j从1遍历到i, dp[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];
        
    }
}