代码随想录算法训练营第四十一天 | 343.整数拆分、96.不同的二叉搜索树

文章目录

  • 一、343.整数拆分
  • 二、96.不同的二叉搜索树


一、343.整数拆分

题目链接

j的作用:用来拆分i。

代码如下:

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n + 1);
        dp[0] = 0; // dp[0]无意义
        dp[1] = 0; // dp[1]无意义(拆成1和0从,乘积还是0)
        dp[2] = 1;
        for (int i = 3; i <= n; i++) {
            for (int j = 1; j <= i / 2; j++) { // j用来拆分i
                // j*(i-j)把整数拆成两个数相乘,j*dp[i-j]把整数拆分成两个以及两个以上的数相乘
                dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j])); // 和dp[i]比较是为了求得最大值
            }
        }
        return dp[n];
    }
};

二、96.不同的二叉搜索树

题目链接

j的作用:用来拆分左右子树。

代码如下:

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n + 1); // dp数组的含义:从1到i为节点组成的二叉搜索树的个数
        dp[0] = 1;
        for (int i = 1; i <=n; i++) {
            for (int j = 1; j <= i; j++) { // j用来拆分左右子树
                dp[i] += dp[j - 1] * dp[i - j]; 
            }
        }
        return dp[n];
    }
};

你可能感兴趣的:(算法,数据结构)