算法力扣刷题记录 八十一【343. 整数拆分】

news2024/9/22 1:13:30

前言

动态规划第8篇。记录 八十一【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,拆分成k个正整数,使得k个正整数乘积最大。但是没有说k能是几。感觉是一种尝试的过程,好像没有方法。
  2. 思考:a + b = 常数;当a=b时,a * b 最大。这个结论在初高中都学过:当几个数的和固定,那么这几个数相等时乘积最大。所以:当n拆分成近似相等的k个数,乘积才会最大
  3. 有了结论后,思考能拆成几个数呢?也就是k如何确定?比如n=11:
    在这里插入图片描述
  4. 所以思路不正确。

三、参考学习

【343. 整数拆分】 参考学习链接

3.1动态规划思路

  1. 原理:分成两个因子,固定一个j,可以继续对n-j拆分。有了固定,就方便遍历。
  2. 同时可以发现下图中:两个因子在n/2之后重复,颠倒顺序而已。所以,遍历到n/2即可结束。
    在这里插入图片描述
  3. dp数组含义和下标含义:一维数组dp[i]。当n=i时,拆分因子后的最大乘积值是dp[i]。
  4. 递推公式:
  • 当拆成两个因子:j * (i-j)
  • 当拆成三个及以上的因子:固定j,继续对i-j拆分。那么i-j拆分后的最大乘积是dp[i-j]。所以此时乘积为j * dp[i-j]
  • 选择最大的:max(j * (i-j) , j * dp[i-j])。
  • dp[i] = max(j * (i-j) , j * dp[i-j] , dp[i]);为什么有dp[i]?因为j是不断遍历的,dp[i]暂时存放某一个j得出的最大乘积。所以加上dp[i]后比较。
  1. 初始化:
  • dp[0]没有含义,dp[0] = 0作为因子乘以 j 后依然是0。不影响结果。
  • dp[1]没有含义,dp[1] = 0作为因子乘以 j 后依然是0。不影响结果。
  • dp[2] = 1.
  1. 遍历顺序:递推公式dp[i]用到dp[i-j]在dp[i]的前面,所以遍历从前往后。

3.2代码实现【动态规划】

class Solution {
public:
    int integerBreak(int n) {
        //定义dp数组
       vector<int> dp(n+1,0);
        //初始化
        dp[2] = 1;

        //遍历顺序
        for(int i = 3;i < n+1;i++){//总和为i
            for(int j = 1;j <= i/2;j++){//拆分两个因子
                dp[i] = max(max(j * (i-j), j * dp[i-j]),dp[i]);
            }
        }
        return dp[n];
    }
};

3.3贪心算法思路

  1. 应用结论:把n拆成多个3,直到无法再拆成3,最后如果是4,则保留4作为最后一个因子。这样得到的乘积最大。
  2. 2是质数,3是质数,没有别的加数,拆到因子包含多个3这一步,对于3无法再继续拆。那么将n尽可能的拆成多个3,最后保留小于等于4的因子,因子之间近似相等,并且无法拆分。
  3. 为什么不是到质数5停止?因为5 = 2+3,还有两个加数。(不是严格证明,可以这样辅助理解下)
    在这里插入图片描述

3.4 代码实现【贪心:尽可能的拆分多个3】

class Solution {
public:
    int integerBreak(int n) {
        if(n == 2) return 1;
        if(n == 3) return 2;
        if(n ==4) return 4;

        int result = 1;
        while(n > 4){
            result *= 3;
            n -= 3;
        }
        result *= n;
        return result;
    }
};

总结

本题需要掌握正确思路,获取方法。贪心给出一种说法可以解释原因,非严格数学证明。
在这里插入图片描述
(欢迎指正,转载标明出处)

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

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

相关文章

货代企业转型海外仓,会面临哪些难点?

根据数据统计&#xff0c;跨境电商出口B2C物流市场规模已经达到3825亿元&#xff0c;其中海外仓物流以2102亿的规模以及55%的市场份额成为主流。从细分领域看&#xff0c;其中FBA物流、第三方仓、自建仓的市场规模分别达到1156亿、736亿、210亿。 在跨境物流行业中&#xff0c…

uniapp粘贴板地址识别 address-parse插件的使用

1&#xff1a; 插件安装 主要是依靠 address-parse 这个插件&#xff1a; 官网 收货地址自动识别 支持pc、h5、微信小程序 - DCloud 插件市场 // 首先需要引入插件 npm install address-parse --save 2&#xff1a;html部分 <view class""><view class&quo…

QT、C++简单界面设计

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {---------------------窗口设置----------------------this->setWindowTitle("南城贤子摄影工作室");//设置窗口标题this->setWindowIcon(QIcon("d:\\Pictures\\C…

并发编程 | 线程池的手动创建

手动创建线程的弊端 在前面我们讲了手动创建线程的使用方式&#xff1a;当一个任务过来&#xff0c;创建一个线程&#xff0c;线程执行完了任务马上又销毁&#xff0c;然后下一次任务过来又重新创建线程&#xff0c;执行完任务再销毁&#xff0c;周而复始。 那么会导致这样一…

【数据结构】-----红黑树

目录 前言 一、what is it&#xff1f; 二、How achieve it&#xff1f; Ⅰ、结点类 Ⅱ、实现 插入 情况一&#xff1a;叔叔存在且为红色 情况二&#xff1a;叔叔不存在或者叔叔为黑色 旋转 验证 ①验证中序遍历 ②验证是否满足红黑树的性质 Ⅲ、完整实现代码 三、A…

【课程总结】day22:Qwen模型的体验

前言 在上一章【课程总结】day21&#xff08;下&#xff09;&#xff1a;大模型的三大架构及T5体验中&#xff0c;我们体验了Encoder-Decoder架构的T5模型。本章内容&#xff0c;我们将以Decoder-Only架构的Qwen模型入手&#xff0c;了解Qwen模型结构、聊天模板的概念以及通过…

类型注解-type hint

目录 一、基本介绍 1、为什么需要类型注解 2、类型注解作用和说明 二、变量的类型注解 1、基本语法 2、基本数据类型注解 3、实例对象类型注解 4、容器类型注解 5、容器详细类型注解 6、在注释中使用注解 三、函数(方法)的类型注解 1、基本语法 2、代码演示 四、…

WebService基础学习

一、XML回顾 二、HTTP协议回顾 三、复习准备 四、关于Web Service的几个问题 五、Web Service中的几个重要术语 六、开发webservice 七、WebService面试题

python面向对象三大特征之---封装,私有属性和私有方法,property功能; 继承,重写,object类;多态;类的深拷贝和浅拷贝

1.面向对象三大特征 封装 1.类属性的创建&#xff1a; 2.属性的访问&#xff1a; 私有属性和方法在类外访问的方法也有&#xff1a;不推荐 对象名._类名__私有方法() 对象名._类名__私有属性3.property功能 在Python中&#xff0c;property 是一个内置的功能&#xff0c;它…

jar包在linux无法直接获取resources文件夹下的文件

windows下&#xff0c;通过hutool的FileUtil.file()就可以获取到文件&#xff0c;通过MailUtil.send()将邮件带附件的方式成功&#xff0c;携带附件发邮件。 linux下部署&#xff0c;截图中的FileUtil.file()是拿不到文件的&#xff0c;报IOException while sending message&a…

「团结引擎1.2.0」正式上线!功能全面升级

「团结引擎 1.2.0」来啦&#xff0c;继上次大版本更新又过了三个月&#xff0c;这段时间我们的研发团队一直在收集用户反馈&#xff0c;更新引擎功能。 本次技术更新的内容&#xff0c;涵盖了微信小游戏、团结引擎车机版、OpenHarmony、Audio、Virtual Geometry、Open Euler/A…

开发食堂采购系统源码:优化供应链管理APP的技术路径

当下&#xff0c;开发一个食堂采购系统源码&#xff0c;并将其集成到供应链管理APP中&#xff0c;成为了优化供应链管理的关键路径之一。 一、食堂采购系统的需求分析 食堂采购系统是食堂日常运营中不可或缺的工具&#xff0c;其主要功能包括采购需求管理、供应商管理、订单管…

《中国数据库前世今生》——历史的深度与未来的展望

在探索科技与历史的交织中&#xff0c;我有幸观看了《中国数据库前世今生》这部纪录片。影片开头它不仅是一段技术演进的回顾&#xff0c;更是中国IT领域从跟随到引领的壮丽史诗。后续深刻研读了专家们的深刻讨论&#xff0c;通过这部纪录片&#xff0c;我深刻感受到了数据库技…

PMP–知识卡片--沟通模型

沟通过程中&#xff0c;发送方想把自己的想法传递给接收方&#xff0c;需要先对想法进行编码&#xff0c;将其变成语言或文字&#xff0c;再选择传递的方式&#xff0c;过程中会受到噪声的影响。这里的噪声是广义的&#xff0c;包括所有影响信息传递效果的因素&#xff0c;如杂…

《Ubuntu22.04环境下的ROS2学习笔记2》

一、在ROS2环境下创建功能包 如果您已经完成了上一小节的内容&#xff0c;那么接下来您一定渴望自己创建一个功能包来实现相应的功能。在ROS1中&#xff0c;您创建的功能包可以既写C/C&#xff0c;又写python&#xff0c;但ROS2中不允许用户这么做&#xff0c;您的C/C和python代…

UniApp的神器-开启前端开发的全新篇章

本文介绍了DIYGW UniApp可视化工具作为一款低代码开发平台的特点和优势。该工具采用拖拽式设计和模块化开发&#xff0c;能够快速转化想法为可运行应用&#xff0c;并支持多种平台部署。它具有所见即所得的设计体验、丰富的组件库、前后台通信模块和跨平台兼容性等特点。使用该…

netsat -ano 详解

netsat -ano会输出一大堆端口&#xff0c;为什么nmap扫描出来的却只有两个 因为我们的服务器或者工作站有开启防火墙&#xff0c;过滤了nmap的流量&#xff0c;导致nmap扫描不到一些端口&#xff0c;再加上我们的开放端口有一些是只有本地才能访问的 怎么看哪些端口只有本地能…

基于Pytorch深度学习图像处理基础流程框架(以ResNetGenerator为例)

文章目录 - 模型搭建1. 搭建ResNetGenerator2. 网络实例化3.加载预训练模型权重文件4. 神经网络设置为评估模式 预测处理1. 定义图片的预处理方法2. 导入图片3. 预处理图片4. 调用模型5. 输出结果 - 模型搭建 1. 搭建ResNetGenerator import torch import torch.nn as nnclas…

go 调用C语言函数或者库

1.查看cgo是否开启 go env | grep CGO_ENABLED CGO_ENABLED1 2. go程序中加入 import "C" 通过 import “C” 语句启用 CGO 特性后&#xff0c;CGO 会将上一行代码所处注释块的内容视为 C 代码块 单行注释使用// 多行注释使用/* */ 3. go 与C 类型转换 在g…

HSL模型和HSB模型,和懒人配色的Color Hunt

色彩不仅仅是视觉上的享受&#xff0c;它在数据可视化中也扮演着关键角色。通过合理运用色彩模型&#xff0c;我们可以使数据更具可读性和解释性。在这篇文章将探讨HSL&#xff08;Hue, Saturation, Lightness&#xff09;和HSB&#xff08;Hue, Saturation, Brightness&#x…