当前位置: 首页 > news >正文

【leetcode100】整数拆分

1、题目描述

给定一个正整数 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、初始思路

2.1 思路

使用动态规划的思想

1、dp表示的是最大乘积

2、递推公式(可以分为两个数相乘,或者两个数以上相乘)

如果是两个数,那么为(i-j)*j,如果为两个数以上,那么为dp[j]*(i-j)

3、初始化dp数组,dp[2]=dp[1]=1

4、确定遍历顺序 

2.2 代码

class Solution:def integerBreak(self, n: int) -> int:if n <= 2:return 1dp = [0] * (n+1)dp[1] = dp[2] = 1for i in range(3,n+1):for j in range(i-1, 1, -1):dp[i] = max(dp[i], max((dp[j] * (i-j)), (i-j)*j))return dp[n]

3 优化算法

3.1 思路

数学上已经证明,对于一个整数 n:最优的拆分方式是将尽可能多地拆分成数字 3。

当剩下的部分是 4 时,不要拆成 3 + 1(因为 3×1 = 3,而 2×2 = 4 更优)。

所以规则是:

  • 拆成尽量多的 3
  • 如果剩下的是 1,那就从前面拿一个 3 改成 2 + 2
  • 如果剩下的是 2 或 4,直接乘上去

3.2 代码

class Solution:def integerBreak(self, n: int) -> int:if n <= 2:return 1if n == 3:return 2a = n // 3m = n % 3if m == 0:res = pow(3,a)elif m == 1:res = pow(3,a-1) * 4else:res = pow(3,a) * 2return res

相关文章:

  • 带宽”(bandwidth)有以下两种不同的意义
  • 41.[前端开发-JavaScript高级]Day06-原型关系图-ES6类的使用-ES6转ES5
  • 【C++游戏引擎开发】第16篇:ImGui指南
  • MTK-Android12 13 屏蔽掉Viewing full screen
  • 【数据结构_9】栈和队列
  • spring:注解@PostConstruct、@PreDestroy
  • 同步 vs 异步 最直白的区别
  • Github webhook 是什么以及它的用途
  • 强化学习的数学原理(四)Value iteration Policy iteration
  • LLamaIndex中经常使用的四个模块
  • 2024年第九届团队程序设计天梯赛c++题解L1-L3-1(附PTA网址)
  • 6 CMD 与 PowerShell 指令大全、C 程序终端运行、字符编码切换指南
  • 【AI工具】用大模型生成脑图初试
  • C++学习记录:
  • 2025主流报表软件评测和推荐
  • 【DeepSeek答】如何成为一名科技领域陪同口译,阶段性学习目标是什么
  • FreeRTOS之消息队列
  • Spring Boot 应用程序中配置使用consul
  • 20250416在荣品的PRO-RK3566开发板的Android13下编译native C的应用程序的步骤
  • 免费使用RooCode + Boomerang AI + Gemini 2.5 Pro开发套件
  • 如何实现输入域名访问网站首页/重庆seo和网络推广
  • 网站图片轮播怎么做/原创文章代写
  • 财经网站源码 织梦/每日财经最新消息
  • 广平专业做网站/网络营销师
  • 深圳网站建设 公司元/网页设计网站建设
  • 商务网站要怎么设计/大学生网络营销策划书