算法思路:
- 特判:当n<=3时,直接返回n-1。因为只有一段绳子,无法继续切割。
- 否则,分为三种情况:
(1) 当绳子长度可以被3整除,全部切成长度为3的段,此时乘积最大。因为3是大于2的最大整数。
(2) 当绳子长度减去3的长度的余数为1,把之前全部切为3,最后一段切为4。因为4是大于3的最小整数。
(3) 当绳子长度减去3的长度的余数为2,把之前全部切为3,最后一段切为2。因为2是大于1的最小整数。 - 根据情况返回最终的最大乘积。
代码的空间复杂度为O(1),时间复杂度为O(1)。该解法明智地利用了贪心策略,得到了最优解。
class Solution {
public int cuttingRope(int n) {
//特判:当n<=3时,直接返回n-1
if(n <=3){
return n - 1;
}
//否则,分为三种情况讨论
else {
//当绳子长度可以被3整除,全部切成长度为3的段,乘积最大
int a = n / 3;
if (b == 0){
return (int)Math.pow(3, a);
}
//当绳子长度减去3的长度的余数为1,把之前全部切为3,最后一段切为4
else if (b == 1){
return (int)Math.pow(3, a - 1) * 4;
}
//当绳子长度减去3的长度的余数为2,把之前全部切为3,最后一段切为2
else {
return (int)Math.pow(3, a) * 2;
}
}
}
}