• 【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. 剪绳子
  • 相关阅读:
    mysql
    selenium
    解决servlet响应乱码问题
    flask后端的跨域问题
    python中并发----线程的启动和停止
    react-native 自定义组件规范
    react-native 高阶组件笔记
    class-dump安装及使用
    jekyll的安装
    取巧的json转model声明代码的工具
  • 原文地址:https://www.cnblogs.com/cling-cling/p/12964407.html
Copyright © 2020-2023  润新知