【剑指offer】14.2. 剪绳子 II

92 阅读1分钟

题目描述

在这里插入图片描述

// 给你一根长度为 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);
	}
}