LeetCode 343. Integer Break 剑指Offer 14. 剪绳子 [Medium]
题目来源:https://leetcode.com/problems/integer-break/
题目难度:Medium
题目
Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.
Example 1:
1 | Input: 2 |
Example 2:
1 | Input: 10 |
Note: You may assume that n is not less than 2 and not larger than 58.
解答1[Java]:动态规划
1 | public class Solution { |
分析
长度为 2 和 3 的时候其实不切更好的,但是要求要切,可以当作特殊情况直接返回对应的结果。
动态规划的思路:
定义一个数组 product[]
,但是注意,长度为 2 和 3 的时候,我们不再切分,所以我们使 product[2]
为 2,product[3]
为 3。然后从 4 开始计算每个数切分后的最大值。
解答2[Java]:贪心算法
1 | public class Solution { |
分析
切要一下一下的切。对于一个数,切还是不切,要看切之后乘积是不是比原来更大。
使用 $N$ 表示一个数,使用函数 $f=x(N-x)$ 表示切分后的乘积。当 $x=\frac{N}{2}$ 时,乘积最大。
但是因为 $N$ 和 $x$ 都必须是整数,
那么当 $N$ 是偶数的时候,则当 $x=\frac{N}{2}$ 时乘积最大,最大为 $\frac{N}{2} \times \frac{N}{2}$。
当 $N$ 是偶数的时候,则当 $x=\frac{N+1}{2}$ 或者 $x=\frac{N-1}{2}$ 时,乘积最大,最大值为 $\frac{N+1}{2} \times \frac{N-1}{2}$
如果想要切分之后的乘积比原来更大,则要求 $\frac{N}{2} \times \frac{N}{2} > N$ 和 $\frac{N+1}{2} \times \frac{N-1}{2} > N$
当 $N$ 是偶数的时候,$N \ge 4$ 的时候,切分后乘积大于等于原来的数。
当 $N$ 是奇数的时候,$N \ge 5$ 的时候,切分后乘积更大。
也就是说,只要 $N \ge 4$ 的时候我们就要切分。2 和 3 的时候不切分。
4 的时候可以切分成 2 和 2,5 的时候可以切分成 2 和 3。
然后你会发现,所有的数最后都会被切分成若干个 2 和若干个 3。
所以现在问题就变成 $N = 2x + 3y$ 如果分配 $x$ 和 $y$ 的问题。
$3(N-3)$ 和 $2(N-2)$ 哪个大?
$3(N-3)-2(N-2)=N-5$
当 $N>5$ 时,优先切 3 的到的结果更大。
当 $N \le 5$ 时,也就只有 4 和 5 两种情况,4 的话切和不切是一样的乘积都不会变大,5 的话切 2 和切 3 是一样的,切完乘积都是 6。