网站救助计划
1.为阅读体验,本站无任何广告,也无任何盈利方法,站长一直在用爱发电,现濒临倒闭,希望有能力的同学能帮忙分担服务器成本
2.捐助10元及以上同学,可添加站长微信lurenzhang888,备注捐助,网站倒闭后可联系站长领取本站pdf内容
3.若网站能存活下来,后续将会持续更新内容
题目描述
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1 并且 m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]*k[1]*…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
提示:
- 2 <= n <= 58
算法
(数学) O(n)
拆分原则:尽可能的拆出多个 3
四部曲:
- 如果
n <= 3
拆成 1 和 n – 1 - 如果
n % 3 == 1
拆出一个 4 - 如果
n % 3 == 2
拆出一个 2 - 最后剩下的全拆成 3
时间复杂度
O(n)
空间复杂度
O(1)
C++ 代码
class Solution {
public:
int cuttingRope(int n) {
if (n <= 3) return 1 * (n - 1);
int res = 1;
if (n % 3 == 1) res *= 4, n -= 4;
if (n % 3 == 2) res *= 2, n -= 2;
while (n) res *= 3, n -= 3;
return res;
}
};
Java 代码
class Solution {
public int cuttingRope(int n) {
if (n <= 3) {
return 1 * (n - 1);
}
int res = 1;
if (n % 3 == 1) {
res *= 4;
n -= 4;
}
if (n % 3 == 2) {
res *= 2;
n -= 2;
}
while (n > 0) {
res *= 3;
n -= 3;
}
return res;
}
}
Python 代码
class Solution:
def cuttingRope(self, n: int) -> int:
if n <= 3:
return 1 * (n - 1)
res = 1
if n % 3 == 1:
res *= 4
n -= 4
if n % 3 == 2:
res *= 2
n -= 2
while n > 0:
res *= 3
n -= 3
return res
本文由读者提供,Github地址:https://github.com/tonngw
点击面试手册,获取本站面试手册PDF完整版