题目链接:剑指 Offer 14- I. 剪绳子
解题思路:数学,贪心
本题要求将绳子剪成可以构造出最大乘积的多段
因为数学推导公式比较复杂,在这里就不予证明了;具体的证明方法可以查看 leetcode 的一篇题解
推导结果:
- 当所有绳段长度相等时,乘积最大
- 最优的绳段长度为3
所以我们的贪心策略为:
- 尽可能地将绳子以长度为 3 等分成多段时,乘积最大
- 如果最后余 1 我们需要将最后一段分为 2 + 2 而不是 3 + 1; 因为 2 2 > 3 1
代码
Java
_
class Solution {
public int cuttingRope(int n) {
// 剪绳子的策略:
// 尽可能将绳子以长度 3 等分为多段时,乘积最大。
// 如果最后余1,我们需要将最后一段分为 2 + 2 而不是 3 + 1; 因为 2 * 2 > 3 * 1
if(n == 2){
return 1;
}
if(n == 3){
return 2;
}
if(n % 3 == 1){
return (int) Math.pow(3, n / 3 - 1) * 4;
}else if(n % 3 == 2){
return (int) Math.pow(3,n / 3) * 2;
}else {
return (int) Math.pow(3, n / 3);
}
}
}
复杂度分析
- 时间复杂度:O(1)
如代码所示,我们并没有循环嵌套,该算法的时间复杂度为:_O(1)
_
- 空间复杂度:O(1)
该算法并没有开辟额外的空间存储变量,额外空间复杂度为:O(1)