问题
例子
思路
跟剪绳子1不一样的是,n的范围变大,剪绳子1中n<=58,此时结果<Integer.MAX_VALUE,
此题:n<=1000,所以中间结果会出现>int的最大值,和大于long的最大值,只能使用BigInteger,比较麻烦
所以:采用贪心算法
可以看到当n>=5时,最大结果总是先割下来长度3,不够5, 直接保留【因为4的最大结果为4(22),3的最大为3(max(3,12)),2的最大为2 (max(2, 1*1) )】
-
方法1
$$$$
-
方法2
$$$$
代码
//方法1
class Solution {
public int cuttingRope(int n) {
if(n==2) return 1;
if(n==3) return 2;
//10^9*3>Integer.MAX_VALUE && 10^9<1000000007
long res = 1;
while(n>=5) {
res = res*3%1000000007;
n-=3;
}
//n出循环时,为4,3,2,
res = (res*n)%1000000007;
return (int)res;
}
}
//方法2