【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

相关问题

  1. 面试题14-1. 剪绳子
posted @ 2020-05-26 11:29  一只背影  阅读(162)  评论(0编辑  收藏  举报