剑指Offer 14.剪绳子

题目:

给你一根长度为 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);
    }
}

牛啊!牛啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值