Fork me on GitHub

[leetcode-343-Integer Break]

Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.

For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).

Note: You may assume that n is not less than 2 and not larger than 58.

思路:

For any integer p strictly greater than 4, it has the property such that 3 * (p - 3) > p, which means breaking it into two integers 3 and p - 3 makes the product larger while keeping the sum unchanged. If p - 3 is still greater than 4, we should break it again into 3 and p - 6, giving 3 * 3 * (p - 6), and so on, until we cannot break it (less than or equal to 4) anymore.

For integer 4, breaking it into 2 * 2 or keeping it as 4 does not change its contribution to the product.
We cannot have more than two 4s, because 2 * 3 * 3 > 4 * 4. We cannot have more than three 2s because 3 * 3 > 2 * 2 * 2.

int integerBreak(int n)
     {
         if (n == 2)return 1;
         if (n == 3)return 2;
         if (n == 4)return 4;
         if (n == 5)return 6;
         if (n == 6)return 9;
         return 3 * integerBreak(n - 3);
         
     }

参考:

https://discuss.leetcode.com/topic/43042/easy-to-understand-c-with-explanation

posted @ 2017-06-23 15:46  hellowOOOrld  阅读(172)  评论(0编辑  收藏  举报