LeetCode刷题笔记——整数拆分问题

LeetCode刷题笔记——整数拆分问题

题目

  1. 整数拆分
    给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58

方法:

方法一:动态规划法
思路
初始化dp数组为n+1,值为1
由于n大于等于2,所以,当

class Solution {
public:
    int integerBreak(int n) {
    	// 初始化一个n+1的数组
        vector<int> dp(n+1,1);
        // n=2时,dp[2]=1
        // 从3开始遍历
        for(int i=3;i<=n;i++)
        	// 分割成两个数字的情况: j*(i-j)
        	// 对上面的情况的i-j再分割,分割成多个数字的情况,可以直接从动态规划数组中获得值。:j*(dp[i-j)
        	//选取这几个值里面的最大值。
            for(int j=1;j<i;j++)
                dp[i]=max(max(dp[i],j*(i-j)),j*dp[i-j]);
        return dp[n];
    }
};

方法二:贪心法
由于2和3可以合成任何数字。要拆成乘积最大的,就是要将原数尽可能多拆出3,然后再拆成2.

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

猜你喜欢

转载自blog.csdn.net/weixin_44583265/article/details/107297326