代码随想录算法训练营第41天| 343. 整数拆分 96.不同的二叉搜索树

JAVA代码编写

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

教程:https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html

方法一:动态规划

思路:能用回溯做,但是不会

  1. 步骤
    1. 定义$dp[i] $数组:表示数字i拆分后的最大乘积
  2. 递推公式dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
    • dp[i] :这里需要比较dp[i]是因为n比较大的时候,内循环会多次遍历,原本还在想dp[i]取最大了干嘛
    • max((i - j) * j, dp[i - j] * j)
      • (i - j) * j:不太理解,代码中j是指k个和中的一个,通过j <= i-j控制j,这样这里就比较好理解,这里是局部的积,算的dp[i],这里的i可能是小于n的
      • dp[i - j] * j:这个很好看懂,i-j+j=i,就是算的dp[i]
  3. dp数组初始化: dp[2] =1
  4. 确定遍历顺序:根据递推公式,从前往后
  5. 举例推导dp数组,以n=6举例
    在这里插入图片描述

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度:O(n)
class Solution {public 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];}public static void main(String[] args) {Solution solution = new Solution();System.out.println(solution.integerBreak(6));}
}

方法二:回溯

思路

复杂度分析

  • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
  • 空间复杂度:O(n)
class Solution {private int maxProduct = 0;public int integerBreak(int n) {if (n == 2) {return 1;}if (n == 3){return 2;}backtrack(n, 1, 1);return maxProduct;}private void backtrack(int n, int start, int product) {if (n == 0) {maxProduct = Math.max(maxProduct, product);return;}for (int i = start; i <= n; i++) {backtrack(n - i, i, product * i);}}}

96.不同的二叉搜索树

  • 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

    示例 1:

    img

    输入:n = 3
    输出:5
    

    示例 2:

    输入:n = 1
    输出:1
    

    提示:

    • 1 <= n <= 19

教程:https://programmercarl.com/0096.%E4%B8%8D%E5%90%8C%E7%9A%84%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html

方法一:动态规划

思路

步骤

  1. 定义$dp[n] $数组:由 n 个节点组成且节点值从 1n 互不相同的 二叉搜索树 有dp[n]种
  2. 递推公式:dp[i] += dp[j - 1] * dp[i - j];j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量
  3. dp数组初始化:dp[0] =1.空节点也是一棵二叉树,也是一棵二叉搜索树,这是可以说得通的。
  4. 确定遍历顺序:根据递推公式,从递归公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,节点数为i的状态是依靠 i之前节点数的状态。
  5. 举例推导dp数组,以n=4举例
    在这里插入图片描述

复杂度分析

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度:O(n)
class Solution {public int numTrees(int n) {//初始化 dp 数组int[] dp = new int[n + 1];//初始化0个节点和1个节点的情况dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {for (int j = 1; j <= i; j++) {//对于第i个节点,需要考虑1作为根节点直到i作为根节点的情况,所以需要累加//一共i个节点,对于根节点j时,左子树的节点个数为j-1,右子树的节点个数为i-jdp[i] += dp[j - 1] * dp[i - j];}}return dp[n];}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/245246.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Optional源码分析(涉及Objects源码和Stream源码)

研究Optional源码之前先谈一谈Objects源码。 主要代码&#xff1a; ForceInlinepublic static <T> T requireNonNull(T obj) {if (obj null) {throw new NullPointerException();} else {return obj;}}ForceInlinepublic static <T> T requireNonNull(T obj, Str…

单个 Zip 文件体积超过 40GB

单个 Zip 文件体积超过 40GB WinRAR 平时用的多,不过有时候为了更好的通用性,也常常用到 zip 格式.查了一下资料,说是 zip 单个文件的体积不能超过 4GB. 自己动手试了下,用 WinRAR 创建出来的 zip 文件,大小可以超过 40GB, 如下图 为了压缩速度快,压缩方式用的是 “存储” Wi…

PHP使用HTTP代码示例模板

PHP是一种广泛用于服务器端的编程语言&#xff0c;它提供了许多内置的函数和扩展&#xff0c;以便开发人员能够轻松地处理HTTP请求和响应。在PHP中&#xff0c;您可以使用以下代码示例模板来处理HTTP请求和生成HTTP响应。 php复制代码 <?php // 处理GET请求 if ($…

Synchronized关键字的底层原理

Synchronized实现 Synchronized创建的时候一个互斥的对象锁&#xff0c;每次只有一个线程可以获取该锁。 其底层主要是基于Monitor实现的&#xff0c;在对象的对象头中存储了MarkWord存储的就是Monitor的地址。 对象的内存结构 对象在内存中存储主要分为三个部分&#xff1a…

天翼云:“百万IOPS”助推政企上云

随着数字化转型的加速&#xff0c;越来越多的企业选择了业务上云。众所周知&#xff0c;不论是政企关键/核心业务中的大型数据库、NoSQL、AI训练&#xff0c;还是互联网业务中的游戏、渲染等场景&#xff0c;对数据读写IOPS和时延有极高的要求。作为全球领先的云服务商&#xf…

第二证券:国际金价创新高 国内锂电企业有望加速出海

12月首个交易日&#xff0c;两市股指盘中弱势下探&#xff0c;午后止跌回升&#xff0c;沪指、创业板指翻红&#xff0c;北证50指数再度跳水。到收盘&#xff0c;沪指微涨0.07%报3031.64点&#xff0c;深成指跌0.07%报9720.57点&#xff0c;创业板指涨0.19%报1926.28点&#xf…

SWD和JTAG

1、调试接口概念 1&#xff09;SWD&#xff1a;Serial Wire Debug&#xff0c;代表串行线调试&#xff0c;是ARM设计的协议&#xff0c;用于对其微控制器进行编程和调试。 SWD 引脚&#xff1a; SWDIO–串行数据线&#xff0c;用于数据的读出和写入SWDCLK–串行时钟线&#…

微积分-圆的面积和周长(1)

微积分 历史 先有牛顿后有天&#xff0c;创世之后再造仙。作为近代物理学的开山鼻祖&#xff0c;牛顿的贡献怎么评价都不为过。而微积分是首先被牛顿搞出来的也已经是公认的事实&#xff0c;牛顿在研究物理问题的时候顺带做出来的&#xff0c;不知是舍不得发表还是不屑于发表…

使用gdb调试正在运行的程序

写一个一秒打印一个数的c程序&#xff0c;并编译运行。 #include<unistd.h> #include<stdio.h> int main(int argc,char **argv){int i0;while(1){sleep(1);i;printf("%d\n",i);}return 0; }vim loop.c gcc loop.c -o loop ./loop 查看该进程的进程号。…

基于粒子群算法思想的电动汽车充放电策略-V2G模型-程序代码!

电动汽车充放电对电网的安全稳定带来影响&#xff0c;合理规划电动汽车充放电时间和策略是目前的研究热点。本程序仿真了汽车有序充电和无需充电两种案例&#xff0c;利用电动汽车合理消纳新能源电量&#xff0c;利用粒子群算法思想来求解模型&#xff0c;程序中案例丰富&#…

EasyRecovery2024破解补丁安装包网盘下载

Ontrack EasyRecovery2024是一款功能强大的数据恢复软件&#xff0c;它可以帮助用户从各种存储设备中恢复丢失或删除的数据。它支持多种文件系统和文件类型&#xff0c;可以恢复包括照片、视频、音频、文档、电子邮件和归档文件等不同类型的数据。 Ontrack EasyRecovery 是一款…

matplotlib与opencv图像读取与显示的问题

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近在用opencv和matplotlib展示图片,但是遇到了一些问题,这里展开说说 首先需要明确的是,opencv和matplotlib读取图片都是通道在最后,而前者默认可见光图像是BGR,后者是RGB.此外还有PIL以及imageio等读取图像的工具…