Toasobi
剪绳子(中等)
本文最后更新于2023年03月07日,已超过673天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
这道题即是整数拆分题,常见的方法有贪心,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>