#leetcode编程日记#343. Integer Break

来源:互联网 发布:网络双向是什么意思 编辑:程序博客网 时间:2024/06/05 20:54

题目描述

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.

For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).

注意事项

You may assume that n is not less than 2 and not larger than 58.

解题思路

 个人觉得是规律题。首先是自己手算下6至10的情况。

6=3+3 -> 3*3=9 [6 mod 3 = 0] 第①种情况

7=2+2+3 -> 2*2*3=12 [7 mod 3 = 1]第②种情况

8=2+3+3 -> 2*3*3=18 [8 mod 3 = 2]第③种情况

9=3+3+3 -> 3*3*3=27 [9 mod 3 = 0] 第①种情况

10=2+2+3+3 -> 2*3*3=18 [10 mod 3 = 1] 第②种情况

从上面可以推出,只要把n分解成尽量多的3就符合要求了。读者可以自己从10后开始算,n总是能分解成n=2*m+3*k的模式,我们尽量让k更大。这里给不出什么数学定理……大牛可以试试自己整个定理来证明下。

下面就可以根据n mod 3 的值进行分类了:

①n mod 3 = 0:这种情况最简单,直接得出3^(n/3)的结果。

n mod 3 = 1:留下一个1比较亏,可以从分解出来的(n/3)个3中取出一个3,和余下的1重新组合成两个2,2*2>1*3嘛

②n mod 3 = 2:把分解好的(n/3)个3乘积起来,再乘以多余的2就可以了。

注意:n=2,3都是例外,单独返回结果就行

代码

class Solution {public:    int integerBreak(int n) {        if(n==2)return 1;        if(n==3)return 2;        int div=n/3;        int mod=n%3;        switch(mod){            case 0:                return pow(3,div);                break;            case 1:                return pow(3,div-1)*4;                break;            case 2:                return pow(3,div)*2;                break;        }    }};






原创粉丝点击