题解 | #剪绳子#
剪绳子
http://www.nowcoder.com/practice/57d85990ba5b440ab888fc72b0751bf8
这题比较偏数学思维了。观察几个数手动切割的结果可以发现,它们最大的乘积都是拆分成若干个2和3相乘得到的,不存在1,5,7。
根据这一结论可以将长度为n的数分为两部分,一部分由若干个3相乘得到,另一部分由若干个2相乘得到,且3必定多于2。
所以实际操作时,可以先找出3部分的乘积,在得出2部分的乘积。最后将两部分相乘即得结果。
具体实现为当n小于4时直接返回4 - 1,因2,3两种情况只能拆分成{1,1}和{1,2}。
然后计算计算n%3的值,当该值等于0时,说明n刚好被3整除,能拆分成n/3个3,此时最大乘积为3^(n/3)。当n%3等于1时,说明该数除3会余1,而我们不希望乘积中有1出现,这样相当于把这个1浪费了,所以我们将这个1与一个3组合成4,这样就得到了两个2,此时最大乘积为(3^((n-4)/3))*4。当n%3等于2时,此时最大成积为(3^(n/3))*2。不存在其他情况。
class Solution {
public:
int cutRope(int number) {
if(number < 4){
return number - 1;
}
else{
if(number % 3 == 0){
return pow(3, number / 3);
}
else if(number % 3 == 1){
int more = number - 4;
return 4 * pow(3, more / 3);
}
else{
return pow(3, number / 3) * (number % 3);
}
}
}
};