刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com
343. 整数拆分 - 力扣(LeetCode)
给定一个正整数 n
,将其拆分为 k
个 正整数 的和( k >= 2
),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
import java.util.Scanner;/*** @author light* @Description 整数拆分* @create 2023-09-14 18:19*/
public class IntegerBreakTest {public static void main(String[] args) {Scanner input=new Scanner(System.in);int n=input.nextInt();System.out.println(integerBreak(n));}public static int integerBreak(int n) {//dp[i] 为正整数 i 拆分后的结果的最大乘积int[] dp = new int[n+1];dp[2] = 1;for(int i = 3; i <= n; i++) {for(int j = 1; j <= i-j; j++) {// 这里的 j 其实最大值为 i-j,再大只不过是重复而已,//并且,在本题中,我们分析 dp[0], dp[1]都是无意义的,//j 最大到 i-j,就不会用到 dp[0]与dp[1]dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));// j * (i - j) 是单纯的把整数 i 拆分为两个数 也就是 i,i-j ,再相乘//而j * dp[i - j]是将 i 拆分成两个以及两个以上的个数,再相乘。}}return dp[n];}
}
96. 不同的二叉搜索树 - 力扣(LeetCode)
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
/*** @author light* @Description 不同的二叉搜索树** @create 2023-09-14 18:49*/
public class NumTreesTest {public int numTrees(int n) {//1 确认dp数组及其含义:dp[i]:输入【i】,共有dp[i]种不同的二叉搜索树//也可以理解是i个不同元素节点组成的二叉搜索树的个数为dp[i] ,都是一样的。//dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]//j相当于是头结点的元素,从1遍历到i为止。int[] dp=new int[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];}
}