题目描述
// 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整
// 数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问
// k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度
// 是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
// 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,
// 请返回 1。
题解
///// 贪心算法 //////
// 思路和剪绳子 I一样的,但是需要把过程分离,
// 每次乘3或乘2都要检查一下是否溢出
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:35.2 MB, 在所有 Java 提交中击败了81.56%的用户
class Solution {
public int cuttingRope(int n) {
if (n < 4) {
return n - 1;
}
else if (n == 4) {
return n;
}
long res = 1;;
while (n > 4) {
res *= 3;
res %= 1000000007;
n -= 3;
}
return (int) (res*n%1000000007);
}
}