剑指offer题解合集——Week2day2

文章目录

  • 剑指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,而且最多俩2

1.肯定不会有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

证毕

其实还可以借助小学的结论
平面图形里,圆的面积最大
也就是要使得两个数的乘积越大,那么两个数越接近越好
详细证明略

你可能感兴趣的:(剑指offer,算法,leetcode,剑指offer,c++)