剑指 offer 14-1 剪绳子(数学推导)

1. 题目描述

剑指 offer 14-1 剪绳子(数学推导)_第1张图片

2. 算法思路

1. 这题严格上来说,数学推导占的比重较大,如果明白下面两点,做起来就很easy

  1. 尽可能的分成相等长度,乘积最大。(这个就不证了,简单常识:算术几何均值不等式
  2. 至于每段分成多长才能最大呢,又数学推导可知,每段分成3,最合适(证明如下图)。

 

2. 在有了上述的两个数学推导作为前提下,就只需要考虑,如果不能完全平分,剩下的数的讨论

  • 当最后一段绳子为2,就保留,无需分成1 + 1
  • 当最后一段绳子为1 ,应该再拿出一份3来,将 3 + 1 变成 2 + 2,因为 4 > 3的

 

3. 接下来就是特殊值讨论

  1. 当绳子为2 ,由于题目强制必须要切,应该分成 1 + 1
  2. 当绳子为3 ,由于题目,应该分成2 + 1,虽然结果比不切要小,但是没有办法。

剑指 offer 14-1 剪绳子(数学推导)_第2张图片

3. 代码

class Solution {
    public int cuttingRope(int n) {
        if(n == 2) return 1;
        if(n == 3) return 2;
        int a = n / 3; //得到分成多少个3
        int b = n % 3; //得到最后一段绳子的长度
        if(b == 0)  return (int)Math.pow(3,a);
        if(b == 1)  return (int)Math.pow(3,a - 1) * 4;
        return (int)Math.pow(3,a) * 2;
    }
}

4. 测试结果

剑指 offer 14-1 剪绳子(数学推导)_第3张图片

剑指 offer 14-1 剪绳子(数学推导)_第4张图片​​​​​​​

 

你可能感兴趣的:(剑指 offer 14-1 剪绳子(数学推导))