- 思路一:
归纳推理法:多分析几个例子,就会发现,平均分成3,取得的乘积是最大的,为什么的,首先我考虑的是先将 该数均分,然后平方,或者将它3次分会得到3次方,那5呢。。。当然,这思路并不能取得最优解,还是老老实实归纳一下,得出结论吧。
/**
* 题目分析:
* 先举几个例子,可以看出规律来。
* 2 : 1*1
* 3 : 1*2
* 4 : 2*2
* 5 : 2*3
* 6 : 3*3
* 7 : 2*2*3 或者4*3
* 8 : 2*3*3
* 9 : 3*3*3
* 10:2*2*3*3 或者4*3*3
* 11:2*3*3*3
* 12:3*3*3*3
* 13:2*2*3*3*3 或者4*3*3*3
*
* 下面是分析:
* 首先判断k[0]到k[m]可能有哪些数字,实际上只可能是2或者3。
* 当然也可能有4,但是4=2*2,我们就简单些不考虑了。
* 5<2*3,6<3*3,比6更大的数字我们就更不用考虑了,肯定要继续分。
* 其次看2和3的数量,2的数量肯定小于3个,为什么呢?因为2*2*2<3*3,那么题目就简单了。
* 直接用n除以3,根据得到的余数判断是一个2还是两个2还是没有2就行了。
* 由于题目规定m>1,所以2只能是1*1,3只能是2*1,这两个特殊情况直接返回就行了。
*
* 乘方运算的复杂度为:O(log n),用动态规划来做会耗时比较多。
*/
public class Solution {
public int cutRope(int target) {
if(target==2){
return 1;
}
if(target==3){
return 2;
}
int x = target/3;
int y = target%3;
if(y==0){
return (int)Math.pow(3,x);
}else if(y==1){
//这里别傻傻的用1*Math.pow(3,x),不然不是浪费了一个1,凑上去4乘不是更大?
return 4*(int)Math.pow(3,x-1);
}else{
return 2*(int)Math.pow(3,x);
}
}
}
- 思路二
数学功底扎实的朋友提供了更科学、更震撼的解法。