TypechoJoeTheme

Toasobi的博客

剪绳子(中等)

本文最后更新于2023年03月07日,已超过562天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

这道题即是整数拆分题,常见的方法有贪心,dp算法
初次写这道题时,利用高中数学知识--求矩阵最大面积求解,即使剪断后的绳子长度都相互接近,这时的乘机可能最大。

问题---知道接近最大,但是到底要剪几段?
答:可以使用for循环,其中i表示段数,将所有乘积比较取最大即可;同时由数学知识得最大值在根号n与n/2之间,所以代码的for循环可以进行优化,优化后时间复杂度大大降低;

代码实现:

<div>class Solution {
    public int cuttingRope(int n) {
        int max = 0;
        int s = (int)Math.sqrt(n);
        if(n == 1 || n ==2)
            return 1;
        if(n == 3)
            return 2;

        for(int i=(s-1>0?s-1:s);i<=n/2;i++){ //m表示几段
            int temp = 1;
            int a,b = 0; //除数,余数
            a = n/i; //除数
            b = n%i; //余数
            temp = (int)Math.pow((a+1),b);
            temp *= (int)Math.pow(a,(i-b));
            if(temp > max)
                max = temp;
        }
        return max;
    }
}
</div>

===================

  • 方法二:贪心算法

===================
贪心算法是用当前局部已知最优解法推全局最优解法。这里写出该题的贪心:
等长段乘积最大----长度为3进行分段为最优----长度为3进行分段为最优,最后若是4则不拆为3,1而是2,2

代码实现:

<div>
public int cuttingRope(int n) {
         if (n==1 || n==2)
            return 1;
        if (n==3)
            return 2;
        int sum=1;
        while (n>4){
            sum*=3;
            n-=3;
        }

        return sum*n;
    }
</div>
朗读
赞(0)
评论 (0)