解题思路:数学
本题和 剑指 Offer 14- I. 剪绳子 唯一的不同点是:本题中绳子长度 n 的取值范围为:2 <= n <= 1000;
_
第一版的剪绳子题解链接:题解
第二版的剪绳子我们需要考虑到大数越界的情况,我们可以使用循环求余法解决越界问题。
对于:
(a ^ b) % p
其等价于求解:
((((a % p) * a) % p) * a) % p ... ) // 进行b次循环
代码
Java
class Solution {
public int cuttingRope(int n) {
if(n == 2){
return 1;
}
if(n == 3){
return 2;
}
// 绳子按照每段长度为3,共可以分成多少段
int cutNums = n / 3;
// 最后的余数
int r = n % 3;
long t = 1;
// 这里不能遍历到 i < cutNums;因为最后要对余数是否为1或2进行处理
for(int i = 0; i < cutNums - 1; i++){
t = 3 * t % 1000000007;
}
// 如果余数为1,我们就需要将最后分成2+2而不是3+1 所以最后需要乘以4并求余返回
if(r == 1){
return (int)(t * 4 % 1000000007);
}
// 如果余数为2,我们就需要将最后的结果乘以3*2并求余后返回
if(r == 2){
return (int)(t * 6 % 1000000007);
}
// 如果能整除3,需要再乘以最后的一段3并求余后返回
return (int)(t * 3 % 1000000007);
}
}
复杂度分析
- 时间复杂度:O(N)
算法中我们对绳子循环取余,循环次数与绳子的长度成正相关,算法的时间复杂度为:_O(N)
_
- 空间复杂度:O(1)
我们只使用了有限的几个变量,所以该算法的额外空间复杂度为:_O(1)