题目:
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1
/*
自己写的垃圾代码:一个一个试,递归找出最大乘机。每次均匀切割,开始剪两刀,然后递增,剩下的绳子继续切割。直到剪完,对比之前的结果如果这次更大,则下一层多剪一刀。否则输出
*/
class Solution {
public int cuttingRope(int n) {
if(n == 2) return 1;
int count = 1;
int max = 1;
while(true){
count++;
int sum = n/count;
sum = sum * cut(n - n/count , count - 1);
if(max > sum) return max;
max = sum;
}
}
public int cut(int n , int count){
if(n <= 1 || count == 1) return n;
return n / count * cut(n - (n/count) , count -1 );
}
}
/*
大神解法:公式推导每段长度为3乘积最大。
*/
class Solution {
public int cuttingRope(int n) {
if(n <= 3) return n - 1;
int a = n / 3, b = n % 3;
if(b == 0) return (int)Math.pow(3, a);
if(b == 1) return (int)Math.pow(3, a - 1) * 4;
return (int)Math.pow(3, a) * 2;
}
}
作者:jyd
链接:https://leetcode-cn.com/problems/jian-sheng-zi-lcof/solution/mian-shi-ti-14-i-jian-sheng-zi-tan-xin-si-xiang-by/
来源:力扣(LeetCode)
//终极压缩版
class Solution {
public int cuttingRope(int n) {
return n <= 3? n - 1 : (int)Math.pow(3, n / 3) * 4 / (4 - n % 3);
}
}
牛啊!牛啊!