【LeetCode】面试题14-2. 剪绳子II
题目:
思路:
本题同<面试题14-1. 剪绳子>相同,只是放大了n的范围,并且要求取余。需要进行比较时,比如上题的另外两个方法都需要进行比较得到最大值,这时考虑取余的问题就比较困难,因为比较大小时可能是取余的数。如下本题的解决方法,不需要进行大小比较,所以可以严格控制大数越界问题。
代码:
Python
class Solution(object):
def cuttingRope(self, n):
"""
:type n: int
:rtype: int
"""
# 动态规划,但并没有严格解决大数越界问题
# 如果对每一步的dp[i]取余会出问题,比如上次dp[i]取余之后小于当前的j * dp[i - j]
# dp = [0 for _ in range(n + 1)]
# dp[1] = 1
# dp[2] = 1
# for i in range(3, n + 1):
# for j in range(1, i):
# dp[i] = max(dp[i], j * (i - j), j * dp[i - j])
# return dp[n] % 1000000007
# 尽量平分,使得每段长度为3
if n <= 3:
return n - 1
a = n // 3
b = n % 3
# 对3^(a-1)循环求余, 避免大数越界(任意中间数都不能越界)
rem = 1
for _ in range(1, a):
rem = (rem * 3) % 1000000007
if b == 0:
return (3 * rem) % 1000000007
if b == 1:
return (4 * rem) % 1000000007
if b == 2:
return (6 * rem) % 1000000007