剪绳子问题最大的感受是 对于数学能力考察要求很高,可以进行数学的推导公式直接求出最大临界点的数值。 3 是一个比较特殊的数字点,因此将数字进行分解出更可能多的3数值
一思路
直接 分解出更多的3
n/3 得到的a指数 n%3得到b余数
根据余数b的值 进行判断 结果运算表达式:
- b==0 3^n
- b==1 (比较特殊 如果是1的话可以补充一个3 换为2*2) 3^n-1 * 4
- b==2 直接进行 3^n * 2
二 问题点
进行规律查询 能够得到 3 是比较特殊的点
三 结果
class Solution {
public int cuttingRope(int n) {
//1.剪绳子 和 那个数字分割 好像8 分割未 2 3 3 最大 3为特殊值
int result = 0;
if (n <= 3) return n - 1;
int a = n / 3;
int b = n % 3;
if (b == 0) {
result = (int)Math.pow(3, a);
} else if (b == 1){
result = (int)Math.pow(3, a-1) * 4;
}else {
result = (int)Math.pow(3, a) * 2;
}
return result;
}
}
然后根据相关题解,可以使用 动态规划 和 贪心思想来求
贪心思想:
class Solution {
public int cuttingRope(int n) {
//1.剪绳子 和 那个数字分割 好像8 分割未 2 3 3 最大 3为特殊值
if (n == 2) return 1;
if (n == 3) return 2;
if (n == 4) return 4;
int res = 1;
while(n > 4){
res *= 3;
n -= 3;
}
return res*n;
}
}
贪心局部最优解,得到全部最优解