【LeetCode: 343. 整数拆分 | 暴力递归=>记忆化搜索=>动态规划 】

news2024/11/23 18:58:15

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善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

🌟 求解思路&实现代码&运行结果


⚡ 暴力法

🥦 求解思路

  1. 简单概括题目的意思:给定一个n,我们需要将其进行拆分,拆分的原则是拆分的个数必须大于2个。
  2. 这个题目其实和我们求解背包类型的动态规划如出一辙,不会的同学可以先去看一下我写的关于背包类型的题解,然后再来学习这道题目就会非常容易。
  3. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码

class Solution {
    public int integerBreak(int n) {
        int[] nums=new int[n-1];
        for(int i=1;i<n;i++) nums[i-1]=i;
        return process(0,nums,n);
    }

    public int process(int index,int[] nums,int target){
        if(index>=nums.length||target<0) return -1;
        if(target==0) return 1;
        int max=Integer.MIN_VALUE;
        for(int i=index;i<nums.length;i++){
            int temp=process(i,nums,target-nums[i]);
            if(temp!=-1){
                max=Math.max(max,temp*nums[i]);
            }
        }
        return max;
    }
}

🥦 运行结果

暴力直接就通过了!!!

在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。

🥦 实现代码

class Solution {

    int[][] dp;

    public int integerBreak(int n) {
        int[] nums=new int[n-1];
        dp=new int[n+1][n+1];
        for(int i=1;i<n;i++) nums[i-1]=i;
        for(int i=0;i<n;i++) Arrays.fill(dp[i],-1);
        return process(0,nums,n);
    }

    public int process(int index,int[] nums,int target){
        if(index>=nums.length||target<0) return -1;
        if(target==0) return 1;
        if(dp[index][target]!=-1) return dp[index][target];
        int max=Integer.MIN_VALUE;
        for(int i=index;i<nums.length;i++){
            int temp=process(i,nums,target-nums[i]);
            if(temp!=-1){
                max=Math.max(max,temp*nums[i]);
            }
        }
        return dp[index][target]=max;
    }
}

🥦 运行结果

通过缓存,将重复计算的结果缓存下来,通过。
在这里插入图片描述


⚡ 动态规划

🥦 求解思路

  1. 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。

🥦 实现代码

class Solution {

    int[][] dp;

    public int integerBreak(int n) {
        int[] nums=new int[n-1];
        dp=new int[n+1][n+1];
        for(int i=0;i<dp.length;i++) dp[i][0]=1;
        for(int i=1;i<n;i++) nums[i-1]=i;
        for(int index=n-1;index>=0;index--){
            for(int target=1;target<=n;target++){
                int max=Integer.MIN_VALUE;
                for(int i=index;i<nums.length&&target-nums[i]>=0;i++){
                    int temp=dp[i][target-nums[i]];
                    if(temp!=-1){
                        max=Math.max(max,temp*nums[i]);
                    }
                }
                dp[index][target]=max;
            }
        }
        return dp[0][n];
    }
}

🥦 运行结果

动态规划搞定,当然还是可以继续进行优化的,有很大的优化空间,大家可以积极的尝试。
在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端三剑客

一.前端是什么&#xff1a; 前端主要是考虑怎样能让用户觉得用起来更舒服&#xff0c;考虑界面布局、交互效果、页面加载速度等等&#xff0c;主要是偏向用户看得见的部分&#xff0c;客户端&#xff08;pc、手机、pad&#xff09;上浏览web。网站的“前端”是与用户直接交互的…

自定义表头之数据库设计

数据库设计实现自定义列 表设计如下&#xff1a; 1.数据表 — 就是excel所有列数据的表 字段&#xff1a;&#xff08;这个表根据你所需要的数据列写就可以&#xff09; 案例&#xff1a; 2.列表 — 就是记录每个excel对应的完整列名 字段&#xff1a;&#xff08;我这边是…

Python语法装饰器

参考&#xff1a; 【【python】装饰器超详细教学&#xff0c;用尽毕生所学给你解释清楚&#xff0c;以后再也不迷茫了&#xff01;-哔哩哔哩】 https://b23.tv/Y6Ss8cN【Python小技巧&#xff1a;装饰器(Decorator)-哔哩哔哩】 https://b23.tv/hacMmem x.1 Python中的Abstract…

探索云原生技术的优势和挑战

文章目录 探索云原生技术的优势和挑战一、云原生技术简介二、云原生技术的优势1. 弹性和可伸缩性2. 高可用性3. 快速迭代和部署4. 更好的安全性和可靠性 三、云原生技术的挑战1. 复杂性2. 安全风险3. 成本 四、总结 结语 探索云原生技术的优势和挑战 随着云计算技术的快速发展…

数字城市发展下的技术趋势,你知道多少?

提到数字城市、智慧城市大家都会感觉经常在耳边听到&#xff0c;但是要确切说出具体的概念还是有一点难度的。具体来说&#xff1a;数字城市是一个集合多种技术的系统&#xff0c;以计算机技术、多媒体技术和大规模存储技术为基础&#xff0c;以宽带网络为纽带&#xff0c;运用…

【JavaScript】ES6新特性(2)

5. 字符串扩展 5.1 includes函数 判断字符串中是否存在指定字符 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…

2023年湖北安全员C证C3学历不够可以报考吗 ?个人如何报考?

2023年湖北安全员C证C3学历不够可以报考吗 &#xff1f;个人如何报考&#xff1f; 2023年建筑施工企业三类人员住建厅安全员C证报考是有一定要求的&#xff0c;很多人条件达不到是不是就不能报考&#xff0c;个人想要报考建筑安全员C证怎么去报名等一系列问题。其实都是可以解决…

云渲染与本地渲染:哪个最好?

我们过去曾指出&#xff0c;本地渲染动画和电影的 2D 或 3D 项目是一个非常耗时且计算密集型的过程。当在场景中使用未优化的几何体或在最终渲染中使用多多边形模型时&#xff0c;诸如此类的变量最终将增加完成单个渲染所需的时间和处理器能力。 为什么渲染需要这么长时间&…

keepalived搭建配置

首先&#xff0c;在搞keepalived的时候&#xff0c;一般都是一主一备&#xff0c;所以需要2台设备。这两台设备&#xff0c;要一致&#xff0c;我之前是用了一台centos&#xff0c;一台ubuntu&#xff0c;然后&#xff0c;搞完以后发现&#xff0c;不管是主还是备都持有vip&…

108.(cesium篇)cesium初始定位动画

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <html lang="en"> <

大学生社团管理系统的设计与实现(论文+源码)_kaic

在网络迅速发展的时代&#xff0c;众多软件被开发出来&#xff0c;给社团的管理带了极大的便利&#xff0c;而学生随着时代的发展越来越最求更加个性化的需求。以此&#xff0c;现在的社团管理以学生为导向&#xff0c;根据学生的需求开发一个适合现代化的大学生社团管理系统&a…

Pytest技巧大揭秘:编写高质量接口自动化测试

目录 前言&#xff1a; 一、Pytest测试框架简介 二、安装Pytest测试框架 三、编写Pytest测试用例 四、Pytest参数化&#xff08;Parameterization&#xff09; 五、Pytest插件的使用 六、总结 前言&#xff1a; 在软件开发中&#xff0c;接口的测试是非常重要的一环。接…

Linux服务器安装MYSQL

安装MYSQL 涉及到的工具及软件连接 链接&#xff1a;https://pan.baidu.com/s/1r577kFeuojUrMoEUn88B8w 提取码&#xff1a;xh93 查看是否已经安装了mariadb 检查linux是否安装了mariadb数据库&#xff0c;mariadb数据库是mysql的分支。是免费开源的。mariadb和msyql会有冲突…

准备半个月,面试5分钟不到就凉了,问的实在太····

从外包出来&#xff0c;没想到竟然死在了另一家厂子 自从加入这家公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以我也就忍了。没想到12月一纸通知&#xff0c;所有人都不许加班&#xff0c;薪资直降30%&#xff0c;顿时有吃不起饭的赶脚。 好在有个…

django ORM框架(操作数据库)第一章

目录 一、ORM框架介绍 二、Django配置数据库 2.1 在本地mysql中创建数据库与用户 2.2 django 连接本地mysql(安装mysqlclient及依赖环境&#xff09;mac安装 三、模型类 3.1、创建模型类&生成迁移脚本&执行迁移脚本 3.2 类属性&表字段介绍 3.2.1 models.Ch…

惊人!2022年我国游戏直播用户规模高达3.82亿人,市场规模1108亿元

随着人们生活水平的提高&#xff0c;人们对娱乐和文化活动的需求也在日益增加&#xff0c;而互联网的快速发展便捷地提供了各种各样丰富多彩的文化和娱乐&#xff0c;也为电子竞技提供了线上直播观看功能&#xff0c;游戏直播逐渐成为社会重要的文化之一。 近年来&#xff0c;…

如何恢复被删除的文件?文件恢复,4招解决!

案例&#xff1a;如何恢复被删除的文件&#xff1f; 【我的一些非常重要的文件保存在电脑中&#xff0c;刚刚一不小心被我删除了&#xff01;请问大家有什么比较可行的被删文件恢复方法吗&#xff1f;】 文件被误删了无法找回会给我们造成很多不便&#xff0c;尤其是重要的文…

JVM 垃圾回收器

GC 分类与性能指标 垃圾收集器概述: 垃圾收集器没有规范中进行过多的规定&#xff0c;可以由不同的厂商、不同版本的 JVM 来实现由于 JDK 的版本处于高速迭代过程中&#xff0c;因此 Java 发展至今已经衍生了众多的 GC 版本从不同角度分析垃圾收集器&#xff0c;可以将 GC 分…

基于语音芯片NV080C方案制作的血氧仪为何实用

随着现代生活水平的提高&#xff0c;人们越来越注重自身的健康状况&#xff0c;而检测血氧和心率数据&#xff0c;成为人们更加重视的健康检测手段之一。血糖仪作为现代化的健康工具&#xff0c;它可以帮助人们更好地了解自己的血糖水平。为方便使用&#xff0c;在血糖仪中加入…

渗透测试--6.1.aircrack-ng破解wifi密码

目录 1.Aircrack-ng简介 1.1 airdump-ng 1.2 aireplay-ng 1.3 aircrack-ng 2.Deauth攻击 3.aircrack-ng工具破解无线网络密码 步骤一&#xff1a;虚拟机连接实验需要用到的网卡 步骤二&#xff1a;设置网卡为监听模式 步骤三&#xff1a;使用wlan0mon网卡扫描附近wif…