1.题目
2.思路
这道题和剪绳子I 几乎一样,唯一的区别在于这里需要取模 int mod = (int)1e9 + 7;
一开始本来打算跟剪绳子I一样的做法,遍历一遍可能可以剪的次数cnt, 对于每个次数cnt(比如11) ,判断一下能否除尽,能整除直接就可以求幂,不能整除比如6.666,就可以拆成两种情况,一种是10个6,和1个余数;或者10个7和1个余数(为负数,就舍弃),找一个最大值。----这样有问题,可能是数据溢出的问题。
正确解法--贪心 (证明可以去看官方题解)
来几个例子说明为什么优先剪成长度为3的大小。
特例:
n = 2, 剪成 1 * 1 = 1;
n = 3, 剪成 1 * 2 = 2;
n = 4, 剪成 2 * 2;
n > 4--都是优先保证先剪成3
n = 5, 3 * 2;
n = 6,3 * 3;
n = 7, 3 * 4 = 3 * 2 *2
n = 8,3 * 3 * 2;
注意:最后一个数跳出循环是while(n > 4)
class Solution {
public int cuttingRope(int n) {
// 贪心:优先拆成3,没有就拆成2
if(n == 2)return 1;
if(n == 3)return 2;
if(n == 4)return 4;
int mod = (int)1e9 + 7;
long ans = 1;
while(n > 4){
ans *= 3;
ans %= mod;
n -= 3;
}
ans *= n;
ans %= mod;
return (int)ans;
}
}
3.结果