14- II. 剪绳子 II

博客介绍了如何使用数学推导和快速幂求余的方法解决《剑指Offer》中剪绳子II的问题,避免大数越界。通过循环和条件判断,实现了在O(log2n)的时间复杂度内计算结果,空间复杂度为O(1)。该方法适用于处理涉及大数运算和优化效率的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指 Offer 14- II. 剪绳子 II

思路:数学推导+快速幂求余

大数越界:当a增大时,最后返回的结果超出int32的取值范围

解决方案:快速幂求余

( x y ) % p = [ ( x % p ) ( y % p ) ] % p (xy)\% p=[(x\% p)(y\% p)]\% p (xy)%p=[(x%p)(y%p)]%p

快速幂求余:

  • 根据求余运算性质可推出:
    x a % p = { ( x 2 % p ) a / / 2 % p a % 2 = = 0 [ ( x % p ) ( x a − 1 % p ) ] % p = [ x ( x 2 % p ) a / / 2 ] % p a % 2 = = 1 x^a\%p= \begin{cases} (x^2\%p)^{a//2}\%p & a\%2==0\\ [(x\%p)(x^{a-1}\%p)]\%p=[x(x^2\%p)^{a//2}]\%p & a\%2==1 \end{cases} xa%p={(x2%p)a//2%p[(x%p)(xa1%p)]%p=[x(x2%p)a//2]%pa%2==0a%2==1
class Solution {
public:
    const int N=1e9+7;

    int cuttingRope(int n) {
        if(n<4) return n-1;
        int b=n%3;
        long rem=1,x=3;
        for(int a=n/3-1;a>0;a/=2){
            if(a%2==1) rem=(rem*x)%N;
            x=(x*x)%N;
        }
        if(b==0) return (int)(rem*3%N);
        if(b==1) return (int)(rem*4%N);
        return (int)(rem*6%N);
    }
};

时间复杂度 O( l o g 2 n log_2n log2n)

空间复杂度 O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值