题目
给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且 m > 1 , m <= n ),每段绳子的长度记为 k[1],...,k[m] 。请问 k[1]*k[2]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18
数据范围: 2 \le n \le 602≤n≤60
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)
代码:
int cutRope(int number ) {
int sum = 1;
while(number > 4){
sum *= 3;
number -= 3;
}
sum *= number;
return sum;
}
分析:问题的关键在于数字4,当长度为四时,剪开与不剪最大长度相同,<4时,剪开后乘积变小;>4时,剪开乘积变大。而且划分每段长度为3要优于每段长度为2,举例子为12,划分长度为3则是3*3*3*3 = 81,4*4*4 = 64。因此当number长度大于4时,就剪开一段长度为3,当不足4时,共有长度为2, 3, 4三种可能,直接乘就是其最大乘积。