算法思路:
- 特判:当n=2或3时,直接返回1或2。
- 定义mod取模,防止结果越界。
- 初始化res=1。
- 当绳子长度大于4时,优先剪出长度为3的段,每段的长度3相乘到res,并取模。同时减去每次切掉的3。
- 当绳子剩下的长度不足4时,直接将其乘到res,并取模。
- 返回res的结果。该算法使用贪心的思想,尽可能剪出长度更长的段,得出最优解。
空间复杂度为O(1),时间复杂度为O(n)。
class Solution {
public int cuttingRope(int n) {
//特判:当n=2或3时,直接返回1或2
if(n == 2) {
return 1;
}
if(n == 3){
return 2;
}
//取模,防溢出
int mod = (int)1e9 + 7;
long res = 1;
//当绳子长度大于4时,尽可能剪出长度为3的段
while(n > 4) {
res *= 3; //每段长度为3,乘到结果中
res %= mod; //取模
n -= 3; //减去已经切的长度
}
//剩下的绳子长度直接相乘,并取模
return (int)(res * n % mod);
}
}