题解 | #剪绳子#

剪绳子

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);
            }
        }
    }
};
全部评论

相关推荐

offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
牛客410815733号:这是什么电影查看图片
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务