文章目录
- 剑指offerWeek2
- 周二:剪绳子
- AC代码
- 思路:
剑指offerWeek2
周二:剪绳子
题目链接:剪绳子
给你一根长度为 n绳子,请把绳子剪成 m段(m、n都是整数,2≤n≤58 并且 m≥2)。每段的绳子的长度记为 k[1]、k[2]、……、k[m]
k[1]k[2]…k[m]可能的最大乘积是多少?例如当绳子的长度是 8时,我们把它剪成长度分别为 2、3、3的三段,此时得到最大的乘积 18样例
输入:8输出:18
AC代码
class Solution {
public:int maxProductAfterCutting(int n) {if (n <= 3) return 1 * (n - 1);int p = 1;while (n >= 5) n -= 3, p *= 3;return n * p;}
};
思路:
整体思路
结论:选用尽量多的3,直到剩下2或者4时,用2,而且最多俩21.肯定不会有1
2.如果有一个数记作n,n大于5,那么可以拆开,n - 3和3,乘积为3 * (n - 3) = 3 * n - 9
已知n > 5,那么3 * n - 9 > n
3. 因此,不会存在大于5的数值
4. 如果存在4,那么可以拆分成2 * 2乘积不变,那么假设没有4,4全被拆分成2 * 2
5. 已知4全被拆分成2 * 2,如果存在2, 2, 2,必然由于4和2拆分出来,4, 2又是由6拆分出来
6. 已知6 = 3 + 3,且3 * 3 > 2 * 2 * 2,所以,不能存在三个2证毕其实还可以借助小学的结论
平面图形里,圆的面积最大
也就是要使得两个数的乘积越大,那么两个数越接近越好
详细证明略