栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

medium 剑指 Offer II. 剪绳子 II 贪心 大数越界

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

medium 剑指 Offer II. 剪绳子 II 贪心 大数越界


贪心(大数):

本题和 剪绳子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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/487973.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号