leetcode 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。
class Solution {
public:
int integerBreak(int n) {
vector<int> dp(n + 1);
dp[2] = 1;
for (int i = 3; i <= n ; i++) {
for (int j = 1; j <= i / 2; j++) {
dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
}
}
return dp[n];
}
};
96.不同的搜索树
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
复习一下搜索树的概念:
二叉树的种类:
1.满二叉树
2.完全二叉树
满二叉树是完全二叉树
3.二叉搜索树:左子树都小于中间结点,右子树都大于中间结点,找元素时间复杂度为O(logn)
4.平衡二叉搜索树:左子树和右子树的高度差不大于1
map和set容器里面的元素都是有序的,因为它的底层实现是平衡二叉搜索树
思路:
dp数组的含义:dp[i]表示以i为头结点有多少种表示方式
j从0开始遍历到i
递推公式:dp[i]+=dp[j]+dp[i-j]
class Solution {
public:
int numTrees(int n) {
vector<int>dp(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];
}
};