Leetcode---剑指Offer题14---剪绳子
目录
剑指Offer-面试题14---剪绳子
剪绳子1
https://leetcode-cn.com/problems/jian-sheng-zi-lcof/
给你一根长度为 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。2 <= n <= 58
这道题主要考察数学找规律的能力。数字>5时,尽量找出多的数字3。
public int CuttingRope(int n)
{
if (n == 2)
return 1;
if (n == 3)
return 2;
int result = 1;
while (n>4)
{
n -= 3;
result *= 3;
}
result *= n;
return result;
}
剪绳子2
https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] 。请问 k[0]*k[1]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 2 <= n <= 1000
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
这题要考虑大数,既然我们主要计算3的个数,当数字比较大时,相当于有很多的3相乘,这时候用快速幂就很效率了。
private const int MODEL = 1000000007;
public int CuttingRope(int n)
{
if (n == 2)
return 1;
if (n == 3)
return 2;
long result = 1;
//需要切割的3的个数
long num3 = 0;
while (n>4)
{
n -= 3;
num3++;
}
result = QuickCal(3, num3);
result = (result*n)% MODEL;
return (int)result;
}
private long QuickCal(long a, long b)
{
long result = 1;
a = a % MODEL;
while (b > 0)
{
if (b%2==1)
{
b--;
result = (result * a) % MODEL;
}
b /= 2;
a = (a * a) % MODEL;
}
return result;
}

浙公网安备 33010602011771号