【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