贪心(大数):
本题和 剪绳子I 一样,但扩大了n的范围,导致了大数越界情况的出现。
动态规划需要借助之前保存的dp[ ]列表,尝试在动态规划的基础上取余,就算把数据类型都换成 long 也是无解的,对每次的 dp[ i ] 取余确实可以避免溢出的问题,但是由于过程中修改了值,会导致最终结果和预期不同。
贪心算法的求解过程就是简单的乘法,(100000009 % 1000000007) * 3 和 (100000009 * 3)% 1000000007的结果是一样的
贪心:当绳子长度大于4时,尽可能多的分成长度为3的小段,这样乘积是最大的。(数学证明leetcode)
n大于4时,切割成长度为3的小段,只要n还大于4,每切除一段3,就累乘起来,然后取模。
大数:答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
c++
class Solution {
public:
int cuttingRope(int n) {
if(n < 4){
return n-1;
}
long res = 1; // 初始值1,则不改变后续乘法后值 1*k=k
while(n > 4){
res *= 3;
res %= 1000000007; // 每次对结果取模
n -= 3;
} // 跳出循环时, n<=4, 不再切
return n * res % 1000000007; // 乘上最后剩下的绳子,再次取模
}
};
python
class Solution:
def cuttingRope(self, n: int) -> int:
if n<4:
return n-1
res = 1
while n>4:
res *= 3
res % 1000000007
n -= 3
return n * res % 1000000007