java数据结构与算法刷题-----LeetCode343. 整数拆分(TODO)

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只不过是将多余的步骤,提前放到dp数组中(就是一个数组,只不过大家都叫它dp),达到空间换时间的效果。它仅仅只是一种优化思路,因此它目前的境地和线性代数一样----虚假的难。

  1. 想想线性代数,在国外留学的学生大多数不觉得线性代数难理解。但是中国的学生学习线性代数时,完全摸不着头脑,一上来就是行列式和矩阵,根本不知道这玩意是干嘛的。
  2. 线性代数从根本上是在空间上研究向量,抽象上研究线性关系的学科。人家国外的教科书都是第一讲就帮助大家理解研究向量和线性关系。
  3. 反观国内的教材,直接把行列式搞到第一章。搞的国内的学生在学习线性代数的时候,只会觉得一知半解,觉得麻烦,完全不知道这玩意学来干什么。当苦尽甘来终于理解线性代数时干什么的时候,发现人家国外的教材第一节就把这玩意讲清楚了。你只会大骂我们国内这些教材,什么狗东西(以上是自己学完线性代数后的吐槽,我们同学无一例外都这么觉得)。

而我想告诉你,动态规划和线性代数一样,我学完了才知道,它不过就是研究空间换时间,提前将固定的重复操作规划到dp数组中,而不用暴力求解,从而让效率极大提升。

  1. 但是网上教动态规划的兄弟们,你直接给一个动态方程是怎么回事?和线性代数,一上来就教行列式和矩阵一样,纯属恶心人。我差不多做了30多道动态规划题目,才理解,动态方程只是一个步骤而已,而这已经浪费我很长时间了,我每道题都一知半解不理解,过程及其痛苦。最后只能重新做。
  2. 动态规划,一定是优先考虑重复操作与dp数组之间的关系,搞清楚后,再提出动态方程。而你们前面步骤省略了不讲,一上来给个方程,不是纯属扯淡吗?
  3. 我推荐研究动态规划题目,按5个步骤,从上到下依次来分析
  1. DP数组及下标含义
  2. 递推公式
  3. dp数组初始化
  4. 数组遍历顺序(双重循环及以上时,才考虑)
  5. dp数组打印,分析思路是否正确(相当于做完题,检查一下)

在这里插入图片描述

方法一:时间复杂度O( n 2 n^2 n2),空间复杂度O(n)

先理解题目细节

在这里插入图片描述
在这里插入图片描述

  1. 这种解法的思路,就是用dp数组保存小于等于目标值n的,每一个正整数值i,将i依次看做要拆分的数,找出它们每一个的最大乘积情况。最终递推到目标值n.
  2. 上面解析过程中,频繁出现i = j+(i-j) 和 i = j+dp[i-j]。这个初学者会很难理解。
  1. i是我们当前要拆分的数,j是我们这次拆分必须有的数,比如i=10代表我们要拆分10这个数,试图找到它的最大乘积。而我们先从j=1开始枚举,也就是这次拆分,必须拆出一个1,剩下的你随便。再比如j=3时,就是我们这次必须先拆出来一个3,剩下的7你随便怎么拆。
  2. 而如果我们只想拆成2个数,比如10 = 1 + 9. i = 10. 而j = 1就表示我们这次拆出来的两个数里面,其中一个必须是1. 剩下一个数是多少呢?不就是10-1 ==> i-j = 9吗。这就有了10 = 1+(10-1) ==> i = j+(i-j)
  3. 那如果我们想拆成3和数或者更多呢?比如我们i = 10. j = 1,也就是这次必须拆出一个1. 那么剩下的9 我们随便怎么拆都行。拆成5和4,或者2和7,满足条件就行.
  4. 但是题目要求我们要最大情况。也就是说剩下的9,我们必须拆成最大的情况。
  5. 那么dp[9]表示的是什么呢?不就是将9拆分,然后乘起来后的最大情况吗?那么既然i = 10,j = 1,剩下的9我们又要拆分成最大情况。那么直接取dp[10-1] 不就可以了吗。 也就有了i = j+dp[i-j];
  1. 因此,这个解法的关键就是,算出从正整数1~n的每个数拆分后乘积的最大情况,保存到dp[i]中。
  1. 如何拆分:枚举每一种情况,用j表示这次拆分,必须拆出来的一个数。j从1开始一直枚举。显然这里是个可以优化的点。方法二会指出。
  2. 每种情况拆分后:算出乘积后,保留最大值,因为题目要求保留最大情况。
解题思路
  1. 暴力求解的思想,就是从1到n一直尝试每一种值,每一种情况。
  2. 但是如果我们预先将其存储到dp数组,就可以直接通过dp, 获取数据,而不用枚举。典型的动态规划题目
  1. 暴力求解,需要每次对两个东西枚举,这种解法只需对一个东西枚举。第二种方法,不需要枚举。
动态规划思考5步曲
  1. DP数组及下标含义
  1. 我们要求出的是当前数拆分后的数乘起来的最大情况。显然dp数组中存储的就是当前数拆分后的数乘起来的最大情况。要求出谁的?显然是对哪个数拆分。那么下标就是代表对哪个数拆分,很显然,只需要一个下标,也就是一维数组。
  1. 递推公式
  1. 因为一个数最少拆成两个数,所以0和1没法拆成两个正整数,正整数从1开始。故:F(0) = F(1) = 0;
  2. 对于其它数i,都有两种情况,将当前数拆分成两个数,设其中一个数为j,则另一个数是i-j,也就是F(i) = j+(i-j)
  3. 另一种情况就是拆成3个及以上个数。设其中一个为j,则剩下的数是i - j = x。这个x拆分后乘积最大情况,我们已经规划过了,就是F(x). 故:F(i) = j+F(i-j)
  1. dp数组初始化

在这里插入图片描述

  1. 数组遍历顺序(单重循环,无需考虑遍历顺序,一共就一维,哪里来的谁先谁后)
  2. 打印dp数组(自己生成dp数组后,将dp数组输出看看,是否和自己预想的一样。)

在这里插入图片描述

代码:时间复杂度O(n^2).空间复杂度O(n)

在这里插入图片描述

class Solution {
    public int integerBreak(int n) {
        int dp[] = new int[n+1];//从0到n,共n+1个值
        for(int i = 2; i <= n ; i++){//至少拆成两个数,从2开始
            int curMax = 0;//用于保存从拆出一个1开始,每种枚举情况的最大值
            for(int j = 1;j<i;j++) {
                //比较curMax当前枚举最大情况,和现在正在枚举的情况,谁大。保留大的
                curMax = Math.max(curMax,Math.max(j*(i-j),j*dp[i-j]));//当前值有两种拆分方案,拆成两个数,或者多个数
            }
            dp[i] = curMax;//只考虑最大情况
        }
        return dp[n];//我们只需要n的拆分后乘积最大情况
    }
}

方法一优化:时间复杂度O(n* l o g 2 n log_2{n} log2n)空间复杂度O(n)

我们每次拆分发现,最大情况下,拆出来的值,都相似,相差不多。而且它们都没有超过一半。比如n = 10 拆出的最大情况是4,3,3. 完全超不过它的一半,也就是超不过5
因此,我们枚举j的时候,只需枚举i/2次
在这里插入图片描述

class Solution {
    public int integerBreak(int n) {
        int dp[] = new int[n+1];//从0到n,共n+1个值
        for(int i = 2; i <= n ; i++){//至少拆成两个数,从2开始
            int curMax = 0;//用于保存从拆出一个1开始,每种枚举情况的最大值
            for(int j = 1;j<=i/2;j++) {//根据数学规律,每个数拆分后想要乘积最大情况下。j不可能超过i的一半
                //比较curMax当前枚举最大情况,和现在正在枚举的情况,谁大。保留大的
                curMax = Math.max(curMax,Math.max(j*(i-j),j*dp[i-j]));//当前值有两种拆分方案,拆成两个数,或者多个数
            }
            dp[i] = curMax;//只考虑最大情况
        }
        return dp[n];//我们只需要n的拆分后乘积最大情况
    }
}

方法二:时间复杂度O(n),空间复杂度O(n)

通过数学归纳我们发现,例如10 = 3+4+3,拆分出的数字一个是它们都不会超过10的一半5.另一个它们都与10的一半5,相差2或者3. 也就是必然拆出2和3中的一个。这是大学数学相关课程的内容。如果你还对高数有印象,应该记得函数的极值如何求吧,但这是方法三会用到的。我们这里只是用了数学归纳法。

  1. 同样我们发现,2和3很固定,拆分2后结果为1,拆分3后结果为2.都是自己本身-1,也就是n-1. 所以如果题目要求我们拆分的n = 2或者3,直接返回n-1即可。

在这里插入图片描述

class Solution {
    public int integerBreak(int n) {
        if (n <= 3) {//n给的<=3直接返回n-1.这是它的数学规律
            return n - 1;
        }
        int[] dp = new int[n + 1];
        dp[2] = 1;
        for (int i = 3; i <= n; i++) {//根据规律,拆出的数,最大情况下,都包含3或者2的一个。
            dp[i] = Math.max(Math.max(2 * (i - 2), 2 * dp[i - 2]), Math.max(3 * (i - 3), 3 * dp[i - 3]));
        }
        return dp[n];
    }
}

方法三:时间复杂度O(1),空间复杂度O(1)

导师让我今天这篇文章必须发出来,他晚上给编程小组讲课要用,但是这个方法,我还没想好怎么讲清楚,反正他们参加比赛也用不到这种难度的方法,所以日后补充。

写了两版稿子,依然不知道如何能讲解的通俗易懂,比如下面的驻点,我试图解释清楚,但涉及到了导数的定义和证明,我需要一定时间思考,如何让没学过微积分的人也能看懂。所以下面我先给出用数学做这道题的所需公式和最终代码。学过微积分的都可以很轻松做出来,因为这严格意义来说,难度只是一道高考的导数压轴题,放到考研数学里面,可能放到选择题第一题都让人觉得是送分题。会的人可以直接参考一下,日后我会补充。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
    public int integerBreak(int n) {

        if(n <= 3) return n - 1;

        int a = n / 3, b = n % 3;

        if(b == 0) return (int)Math.pow(3, a);

        if(b == 1) return (int)Math.pow(3, a - 1) * 4;

        return (int)Math.pow(3, a) * 2;

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++力扣题目226--翻转二叉树

给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]示例 3&#x…

【算法与数据结构】746、LeetCode使用最小花费爬楼梯

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题可以从0阶或者1阶台阶开始&#xff0c;每次爬楼梯所需的花费是之前的花费dp[i]从本层向上爬所需的…

入门实战丨Python小游戏经典案例

文章目录 写在前面判断与循环小游戏猜数游戏龙的世界 写在后面 写在前面 本期内容&#xff1a;两个个简单的Python小游戏入门案例。 实验需求&#xff1a;python 实验目标&#xff1a;掌握基本的判断与循环语句。 判断与循环 判断与循环是编程中非常重要的两个概念&#x…

机器学习顶会ICML 2024今日开放投稿,CCF A类,中稿率27.94%(附ICML23杰出论文+18篇高分论文)

ICML 2024今天开放投稿了&#xff01;距离截稿还有24天&#xff0c;想冲ICML的同学速度&#xff01; ICML 全称 International Conference on Machine Learning&#xff0c;由国际机器学习学会&#xff08;IMLS&#xff09;举办&#xff0c;与NIPS一同被认为是人工智能、机器学…

面试宝典进阶之redis缓存面试题

R1、【初级】Redis常用的数据类型有哪些&#xff1f; &#xff08;1&#xff09;String&#xff08;字符串&#xff09; &#xff08;2&#xff09;Hash&#xff08;哈希&#xff09; &#xff08;3&#xff09;List&#xff08;列表&#xff09; &#xff08;4&#xff09;Se…

程序员面试技巧:成为HR心动的程序猿

文章目录 程序员必备的面试技巧导语一、准备充分二、突出亮点三、展示解决问题的能力四、良好的沟通能力五、积极展示学习态度示例结语&#x1f636; 写在结尾 程序员必备的面试技巧 “程序员必备的面试技巧&#xff0c;就像是编写一段完美的代码一样重要。在面试战场上&#…

vue3 +TS 安装使用pinia状态管理

目录 一.安装 1.下载安装依赖 2.创建src/stores/index.ts文件 3.创建src/stores/states.ts文件 4.创建src/stores/interface/index.ts文件 5.修改main.ts 6.目录结构如下 7.测试使用 8.去到首页点击按钮&#xff0c;打开控制台查看 一.安装 1.下载安装依赖 npm insta…

人类认知中的等价机理与机器智能中等价机理

人类认知中的等价机理是指人们在认知过程中&#xff0c;通过将不同的概念、事物或情境进行等价替代&#xff0c;从而实现思维的连贯和理解的补充。例如&#xff0c;当人们看到一个陌生的动物时&#xff0c;可以将它与已知的动物进行等价对应&#xff0c;从而理解其特征和行为。…

基于SpringBoot的毕业生实习与就业管理系统(系统+数据库+文档)

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目 希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一、绪论 1. 研究背景 现在大家…

私域流量转化差,这些问题你都解决了吗?

一、流量不精准 这是一个常见而又经常被忽视的问题。许多企业在私域运营中面临转化率低下的问题&#xff0c;但有没有想过&#xff0c;这可能只是因为你吸引的流量与你的产品不匹配&#xff1f; 从公域引流到私域&#xff0c;数量并非唯一关键&#xff0c;精准度更是重中之重…

如何在移动应用程序的 POC、原型和 MVP 之间做出选择?

许多企业家、企业和行业在决定是否将移动应用程序开发理念作为概念验证 (POC)、最小可行产品 (MVP)、原型或组合来推进时面临着挑战。 由于这三种方法对其利用都有各自的影响&#xff0c;因此正确理解每个方面并选择合适的方法将有助于利益相关者最大限度地提高其想法在用户和所…

送货单打印要用什么打印机和软件

在打印送货单时&#xff0c;打印机和软件的选择都是非常重要的。根据需求&#xff0c;可以选择喷墨打印机、激光打印机或针式打印机等类型&#xff0c;而软件我们可以选择专业的送货单打印软件&#xff0c;例如&#xff1a;方可销售送货单软件&#xff08;推荐&#xff09;就是…

Banner设计专家详细解释和使用技巧!

一、banner的作用 宝安在运营工作中具有吸引注意力、提高转化率、传达信息、提升品牌形象、引导用户行为、营造活动氛围等多种功能。因此&#xff0c;在运营工作中&#xff0c;需要根据具体需要和目标精心设计和合理使用宝安&#xff0c;才能达到更好的运营效果。 二、banner…

生信 R语言

11.芯片表达矩阵下游分析 ​rm(list ls())#清除所有变量 options(stringsAsFactors F) #BiocManager::install("CLL") suppressPackageStartupMessages(library(CLL)) data("sCLLex") sCLLex ## ExpressionSet (storageMode: lockedEnvironment) ## as…

RHCE9学习指南 第17章 进程管理

17.1 进程介绍 在Windows下打开任务管理器就可以查看到系统所有进程&#xff0c;如图17-1所示。 图17-1 Windows下的任务管理器 这里列出了系统中所有的进程。不过也可以使用命令行工具来查看进程。每个进程都会有一个process ID&#xff0c;简称为pid。 17.2 查看进程 也可…

解决录制的 mp4 视频文件在 windows 无法播放的问题

解决录制的 mp4 视频文件在 windows 无法播放的问题 kazam 默认录制保存下来的 mp4 视频文件在 windows 中是无法直接使用的&#xff0c;这是由于视频编码方式的问题。解决办法&#xff1a; 首先安装 ffmeg 编码工具&#xff1a; sudo apt-get install ffmpeg 然后改变视频的…

鸿鹄云商B2B2C:JAVA实现的商家间直播带货商城系统概览

【saas云平台】打造全行业全渠道全场景的saas产品&#xff0c;为经营场景提供一体化解决方案&#xff1b;门店经营区域化、网店经营一体化&#xff0c;本地化、全方位、一站式服务&#xff0c;为多门店提供统一运营解决方案&#xff1b;提供丰富多样的营销玩法覆盖所有经营场景…

使用Python打造一个爱奇艺热播好剧提前搜系统

目录 一、系统功能设计 二、数据获取与处理 三、搜索功能实现 四、用户界面设计 五、系统部署与维护 六、总结 随着互联网的普及和人们对于娱乐需求的增加&#xff0c;视频网站成为了人们观看电视剧、电影等视频内容的主要渠道。爱奇艺作为国内知名的视频网站之一&#x…

ChatGLM3-6B的本地api调用

ChatGLM3-6B的本地api调用方式 1.运行openai_api_demo路径下的openai_api.py 启动后界面&#xff1a; 注意&#xff1a;本地api调到的前提是——本地部署了ChatGLM3-6B,本地部署的教程可参考&#xff1a; 20分钟部署ChatGLM3-6B 部署了若CUDA可用&#xff0c;默认会以CUDA方…

【读书笔记】《白帽子讲web安全》浏览器安全

目录 第二篇 客户端脚本安全 第2章 浏览器安全 2.1同源策略 2.2浏览器沙箱 2.3恶意网址拦截 2.4高速发展的浏览器安全 第二篇 客户端脚本安全 第2章 浏览器安全 近年来随着互联网的发展&#xff0c;人们发现浏览器才是互联网最大的入口&#xff0c;绝大多数用户使用互联…