package com.freetymekiyan.algorithms.level.medium;
/**
* 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.
* <p>
* For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).
* <p>
* Note: You may assume that n is not less than 2 and not larger than 58.
* <p>
* Hint:
* <p>
* There is a simple O(n) solution to this problem.
* You may check the breaking results of n ranging from 7 to 10 to discover the regularities.
* <p>
* Tags: Dynamic Programming, Math
*/
public class IntegerBreak {
/**
* Math.
* If factor x >= 4, we can decompose it into 2 and (x-2), 2 * (x-2)= 2x - 4 > x.
* So the final product will be larger, means that the product won't exceed 4.
*/
public int integerBreak(int n) {
if (n == 2) {
return 1;
}
if (n == 3) {
return 2;
}
int product = 1;
while (n > 4) {
product *= 3;
n -= 3;
}
return product * n;
}
}