343. Integer Break

在这里插入图片描述

一个比较数学的题目,但是可以用自己的方法做出来。
稍微对这一道题目有点印象就可以了。
自己的方法:dp

class Solution {
public:
    int integerBreak(int n) {
        if (n < 2)
            return 0;
        vector<int> dp(n+1, 0);
        dp[1] = 1;
        dp[2] = 1;
        for (int i = 3; i <= n; ++i) {
            int maxNum = 0;
            for (int j = 1; j <= i-1; ++j)
                maxNum = max(maxNum, max(j * (i-j), j * dp[i-j]));
            dp[i] = maxNum;
        }
        return dp[n];
    }
};

方法二:
只将每个数划分为2和3.
解释:为什么不能够划分为>= 4的数呢?假设有一个因子为f >= 4,那么可以很容易的将它划分为2和f-2,它们的积为2*f - 4 > f,所以不应该出现大于等于4的。
因为出现1是浪费,所以不应该出现1(除了对2,3本身计算之外)
然后因为3 * 3 比2 * 2 * 2好,所以2不应该出现超过两次。

class Solution {
public:
    int integerBreak(int n) {
        if (n < 2)
            return 0;
        if (n == 2)
            return 1;
        int ret = 1;
        while (n > 6) {
            ret *= 3;
            n -= 3;
        }
        if (n == 6)
            return ret * 3 * 3;
        return ret * 2 * (n-2);
    }
};

这题其实没什么意思,要是真面试出了这题就用dp,如果非要最优解法,就有点劝退的意思了。

posted @ 2019-10-04 20:49  于老师的父亲王老爷子  阅读(12)  评论(0)    收藏  举报