LeetCode:343. 整数拆分 && 96.不同的二叉搜索树

文章介绍了两种使用动态规划和贪心算法解决的编程问题。一是寻找正整数n的最大乘积拆分,二是计算不同节点值的二叉搜索树种类。动态规划方法用于求解整数拆分的最大乘积,而贪心策略在处理二叉搜索树问题时能有效简化计算过程。
摘要由CSDN通过智能技术生成

343. 整数拆分

题目

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
在这里插入图片描述

动态规划

class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n + 1];
        // 拆分0和1的最大乘积也就是本身,所以不需要初始化
        dp[2] = 1;
        for(int i = 3; i <= n; i++){
            for(int j = 1; j <= i - j; j++){
                // 递推公式
                // dp[i]:拆分值,获取乘积最大值
                // j * (i - j):将正整数拆分成两个数相乘
                // j * dp[i - j]:将正整数拆分成两个数及以上相乘
                dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
            }
        }
        return dp[n];
    }
}

贪心

class Solution {
    public int integerBreak(int n) {
        if (n == 2) return 1;
        if (n == 3) return 2;
        if (n == 4) return 4;
        int result = 1;
        while (n > 4) {
            result *= 3;
            n -= 3;
        }
        result *= n;
        return result;
    }
}

96.不同的二叉搜索树

题目

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
在这里插入图片描述

动态规划

class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        // dp初始化
        dp[0] = 1;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= i; j++){
                /**
                从两个方面计算有多少种二叉搜索树:
                    1.i为根节点,当从1到i作为每个二叉搜索树的根节点时,
                      需要进行累加
                    2.一共有i个节点,当i不再作为根节点存在,
                      而是j作为根节点存在时,那么j的左子树个数为j - 1,
                      右子树的个数为i - j
                */
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        return dp[n];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值