递归算法
/**
* 4可剪成2 * 2, 5可以剪成2 * 3...
*
* 要么剪成长度为2的,要么剪成长度为3的,递归找到乘积
* 最大的剪法。
*/
public int cut(int n){
if(n <= 3){
return n;
}
return Math.max( 2 * cut(n - 2), 3 * cut(n - 3));
}
public int cuttingRope(int n) {
if(n == 2) return 1;
if(n == 3) return 2;
return cut(n);
}
贪心算法
class Solution {
public int cuttingRope(int n) {
if(n <= 3) return n - 1;
int nums = n / 3;
int lastLen = n - nums * 3;
//如果刚好能被3整除,直接返回
if(lastLen == 0){
return (int) Math.pow(3, nums);
}
// 最后一段长度为1,应该与前一段的3生成4(再剪成2 * 2两段),因为2 * 2 > 3 * 1
else if(lastLen == 1){
nums--;
return (int) Math.pow(3, nums) * 4;
}
// 最后一段长度为2
return (int) Math.pow(3, nums) * 2;
}
}