LeetCode : 343. Integer Break

这是一道第一眼看到就觉得有故事的题目!

想到用穷举法,用DFS去做,但问题在于,如果数字特别大,岂不会特别慢,即使可以剪枝,剩下的还是会有大量的重复。

然后就开始试着找规律,想用数学的方法去证明,能不能采用分治法或者贪心算法把这些规律搞掉。

对于C=A+B而言,当A=B=1/2*C时,A*B的乘积最大,但这种结果并不具备传递性。

既然是乘积,不免考虑到幂函数的情况,Y=X^n+(0,1,2,...,n-1)。要找到X等于多少的时候是最佳解。

毕业这么多年了,指数函数什么的早就忘了,最后证明无能,只能试一试,居然发现,貌似就是X就是等于3.

到了这一步,这个问题就简单了:

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

搞定!

posted @ 2016-05-04 10:39  盛小胖  阅读(142)  评论(0编辑  收藏  举报