343. 整数拆分

 

题目链接

https://leetcode-cn.com/problems/integer-break/

343. 整数拆分_第1张图片

首先根据题目很容易的到的一个点是 要使乘积最大能选择的 数字只能是1 2 3 ,之后选择的任何一个数都可以拆分成这三个的乘积所以只要选这三个就可以。

证明方法就是 :

假设输入的数为x在x>4 的时候 2(x-2)>x恒成立因此在选择 乘积大于4的时候总是能选择一个 x 和 x-2 拆分这个数据

如果选择 整数4  也可以用 2 *2 代替 4 (相当于是拆分了)

所以我们如果选择一个乘数肯定不会大于4 也就是只能选择1 2 3

如果小于4则最大乘积就是本身

这样的话实际上就可以解决这个问题了

class Solution {
public:
    int integerBreak(int n) {
    if (n <= 3) return n - 1;
        int ans = 1;
        while (n > 4) {
            ans *= 3;
            n -= 3;
        }
        return ans * n;
    }
};

 还可以在进一步

如果n >=5的时候是不会选择数字1 的

证明如下:

如果选择 1

n - 1 >=4

这样就回到之前证明的这里总能拆分成两个数的乘积 在这两个数中任意一个数 +1 都会大于 选一情况,所以在n>=5的时候不需要选择1

同样的在n>=5的时候不会出现 3 个2 (以上) 因为  3*3 >2 * 2 *2

在这里n =4 同样可以考虑进去

using namespace std;
class Solution {
public:
    int integerBreak(int n) {
        if (n <= 3) {
            return n - 1;
        }
        int quotient = n / 3;
        int remainder = n % 3;
        if (remainder == 0) {
            return (int)pow(3, quotient);
        } else if (remainder == 1) {
            return (int)pow(3, quotient - 1) * 4; //等于1 只能是4的倍数 
        } else {
            return (int)pow(3, quotient) * 2;	//等于2 只能是2的倍数 
        }
    }
};

 

 

你可能感兴趣的:(每日一题)