leetcode 343. 整數拆分

給定一個正整數 n,將其拆分爲至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。

示例 1:

輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1。
示例 2:

輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/integer-break
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。


思路分析

  1. 數學解答,可以發現在大多情況下,3越多積越大,餘下部分考慮1和2的解決:
    當爲1時,加上一個3組成4;
    當爲2時,直接乘上即可。
  2. 動態規劃

代碼分析

數學解答:

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

在這裏插入圖片描述

動態規劃

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

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章