Leetcode力扣秋招刷题路-0343

从0开始的秋招刷题路,记录下所刷每道题的题解,帮助自己回顾总结

343. 整数拆分

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积 。

示例 1:
输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:
输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

提示:
2 <= n <= 58

只要稍作分析就能发现,除了最后一位,其他全拆为3就是最佳答案 证明:拆1出来,憨憨行为 拆2出来,只要大于4,拆2和拆成4是一样的,4=2+2,4=22,所以没必要 拆3出来,可 如果拆一个4出来,4=3×1+1,放在最后一位可,拆两个4出来,4+4=8,2+3+3=8,4×4=16<3×3×2=18,所以4最多出现一次,即为最后一个被拆分的 如果拆个5出来,5=2+3,2×3=6,显然不如拆为2和3结果大,所以5不可能出现 对于6也是,6 = 3+3,3×3=9,显然不如3来的划算 而对于大于6的更是不可能出现,比如7随便看作2+5,25=10就已经比7大了 综上憨憨分析,只可能拆分为2,3,4而2和4最多只能出现在最后一位

public int integerBreak(int n) {
    if (n == 2) {
        return 1;
    }
    if (n == 3) {
        return 2;
    }
    int q = n / 3;
    int r = n % 3;
    int res = 1;
    res *= Math.pow(3, q);
    if (r == 0) {
        return res;
    } else if (r == 1) return res / 3 * 4;
    else {
        return res * 2;
    }
}

你可能感兴趣的:(Leetcode,leetcode,算法,数据结构)