非科班菜鸡算法学习记录 | 代码随想录算法训练营第41天||343. 整数拆分 96.不同的二叉搜索树

343. 整数拆分

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

知识点:动规

状态:看答案

思路:

class Solution {
public:

    int integerBreak(int n) {
        vector  dp(n+1,0); // 拆分数字 i 时所得到的最大乘积
        dp[2] = 1;
        for(int i = 3; i <= n; i++ ) {
            for(int j = 1; j < i; j++){
                dp[i] =  max(dp[i], max( j * (i - j), dp[i-j]* j) ); // 注意是三个求max,原理是固定j,求j * (i - j)和j* dp[i-j]的最大值
            }
        }
        return dp[n];
    }
};

非科班菜鸡算法学习记录 | 代码随想录算法训练营第41天||343. 整数拆分 96.不同的二叉搜索树_第1张图片

96.不同的二叉搜索树

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

知识点:动规

状态:看答案

思路:卡哥答案力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

dp[i] 是i个不同元素节点组成的二叉搜索树的个数

所以递推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量

class Solution {
public:
    int numTrees(int n) {
        vector dp(n+1,0);
        dp[0]=1;
        for(int i = 1; i <=n;i++){
            for(int j = 1; j <=i; j++){
                // 二叉搜索树,j为根节点一定是从1开始(由题知),
                // 它是由他左边比他小的dp[j-1]和比它大的dp[i-j]相乘
                dp[i] += dp[j-1] *dp[i-j];
            }
        }
        return dp[n];
    }
};

非科班菜鸡算法学习记录 | 代码随想录算法训练营第41天||343. 整数拆分 96.不同的二叉搜索树_第2张图片

你可能感兴趣的:(学习)