如何在企业版社保网站做增员,自助免费建站,乐陵市,如何加强网站安全建设一、LeetCode343. 整数拆分
题目链接#xff1a;343. 整数拆分
题目描述#xff1a;
给定一个正整数 n #xff0c;将其拆分为 k 个 正整数 的和#xff08; k 2 #xff09;#xff0c;并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。 示例 1:
输入…一、LeetCode343. 整数拆分
题目链接343. 整数拆分
题目描述
给定一个正整数 n 将其拆分为 k 个 正整数 的和 k 2 并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。 示例 1:
输入: n 2
输出: 1
解释: 2 1 1, 1 × 1 1。
示例 2:
输入: n 10
输出: 36
解释: 10 3 3 4, 3 × 3 × 4 36。 提示:
2 n 58
算法分析
定义dp数组及下标含义
dp[i]表述正整数i拆分成k个正整数乘积所能够得到的最大值。
递推公式
用一个j来遍历从1到i,得到两个dp[i]即dp[i]j*(i-j)(将整数i分成两个正整数j和i-j),和dp[i]j*dp[i-j]。
所以dp[i] max(dp[i],max(j*(i-j),j*dp[i-j]))。
初始化
dp[0]和dp[1]初始化没有意义所以我们初始化dp[2]1(2拆分成两个1相乘)。
遍历顺序
因为dp[2]已经初始化了所以我们从3遍历到n。
代码如下
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; j) {dp[i] Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));}}return dp[n];}
}
时间复杂度o(n^2)空间复杂度o(n)。
二、LeetCode96. 不同的二叉搜索树
题目链接96. 不同的二叉搜索树
题目描述
给你一个整数 n 求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种返回满足题意的二叉搜索树的种数。 示例 1 输入n 3
输出5示例 2
输入n 1
输出1提示
1 n 19
算法分析
定义dp数组及下标含义
dp[i]表示i个节点组成的二叉搜索树的种树。
递推公式
j从1遍历到i当j为头节点时左子树有i-1个节点左子树的种类数相当于dp[j-1]右子树有i-j个节点右子树的种类数相当于dp[i-j]。
所以dp[i]dp[j-1]*dp[i-j],j从1比那里遍历到i;
初始化:
dp[0]初始化为10的话会影响乘法结果dp[1]初始化为1一个节点的二叉搜索树只有一种情况
遍历顺序
i从2遍历到n然后确定dp[i](dp[i]dp[j-1]*dp[i-j])。
如果结果有误打印dp数组检查验证。
代码如下
class Solution {public int numTrees(int n) {int[] dp new int[n 1];dp[0] 1;dp[1] 1;for(int i 2; i n; i){for(int j 1; j i; j) {dp[i] dp[j - 1] * dp[i - j];}}return dp[n];}
}
时间复杂度on^2空间复杂度o(n)
总结
这两道题还是比较难的自己想很难有思路。