• 【LeetCode】【剑指offer】【剪绳子(二)】


    剑指 Offer 14- II. 剪绳子 II

    给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m - 1] 。请问 k[0]*k[1]*...*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

    答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

    示例 1:

    输入: 2
    输出: 1
    解释: 2 = 1 + 1, 1 × 1 = 1
    示例 2:

    输入: 10
    输出: 36
    解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/jian-sheng-zi-ii-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

     

     

    乍一看,这道题和剪绳子(一)没啥区别,细一看,这道题要求将结果取模,

    好家伙,这道题的每一个测试用例都非常大,非常容易发生溢出的情况

    我们需要针对剪绳子(一)的写法进行一些调整

    置于具体的算法此处不再做解释,直接参考

    【LeetCode】【剑指offer】【剪绳子(一)】_桜キャンドル淵的博客-CSDN博客 

    循环幂求余法 

    这里针对于大数,我们在每一次乘法,的时候都需要模上 1000000007,

    并且将我们的x,res修改成long int(已经测过int的话会溢出) 

    1. class Solution {
    2. public:
    3. int cuttingRope(int n) {
    4. if(n<=3)
    5. {
    6. return n-1;
    7. }
    8. long int x=n/3;
    9. int y=n%3;
    10. long int res=1;
    11. if(y==0)
    12. {
    13. while(x--)
    14. {
    15. res=(3*res)%1000000007;
    16. }
    17. return res;
    18. }
    19. if(y==1)
    20. {
    21. x=x-1;
    22. while(x--)
    23. {
    24. res=(3*res)%1000000007;
    25. }
    26. res=(res*4)%1000000007;
    27. return res;
    28. }
    29. while(x--)
    30. {
    31. res=(3*res)%1000000007;
    32. }
    33. res=(res*2)%1000000007;
    34. return res;
    35. }
    36. };

    快速幂算法

    假如要求3^{5},由于五是奇数,所以我们可以把一个3提取出来,变成3^{4}乘3

    然后3的四次方是偶数,可以拆分为3^{2}×3^{2}

    也就是说计算3^{5}其实只需要先算出3的平方9,然后再算出9的平方81,最后再乘上那个单独的3就可以得出243了。

     下面我们就定义了一个remainder来实现我们的上述算法

    1. class Solution {
    2. public:
    3. //x的值一定要是long,否则会存不下
    4. //返回的remainder的值也一定要是long否则会存不下
    5. //x为底数,a为指数,p为要取的模
    6. long remainder(long x,int a,long p)
    7. {
    8. //rem为我们最终快速幂乘法的返回结果
    9. int rem=1;
    10. while (a>0)
    11. {
    12. //如果a是奇数的话,我们就直接将这个多出来的底数乘给我们的返回结果
    13. //并且每一步运算都要对p取模防止溢出
    14. if ((a%2)==1)
    15. {
    16. rem=(rem*x)%p;
    17. }
    18. //如果是偶数的话,就直接平方再取模
    19. x=(x*x)%p;
    20. //然后我们的指数就可以直接整除2了
    21. //这样就实现了快速幂算法
    22. a/=2;
    23. }
    24. return rem;
    25. }
    26. //下面对我们之前的代码进行一些微调即可
    27. int cuttingRope(int n) {
    28. long p=1000000007;
    29. if(n<=3)
    30. {
    31. return n-1;
    32. }
    33. long int x=n/3;
    34. int y=n%3;
    35. long int res=1;
    36. if(y==0)
    37. {
    38. return remainder(3,x,p);
    39. }
    40. if(y==1)
    41. {
    42. x=x-1;
    43. res=(remainder(3,x,p)*4)%p;
    44. return res;
    45. }
    46. res=(remainder(3,x,p)*2)%p;
    47. return res;
    48. }
    49. };

     

  • 相关阅读:
    深入浅出PyTorch——基础知识
    C++:内存管理:C++内存管理详解(二):带你攻破内存管理
    hive抽取mysql里的表,如果mysql表没有时间字段如何做增量抽取数据
    毕业设计opencv 图像识别 指纹识别 - python
    2022-05-20每日刷题打卡
    vue3 使用 vite 构建的项目打包后无法访问
    J2EE项目部署与发布(Windows版本)
    Docker安装Mysql
    Webpack
    企业数据管理数据备份与恢复
  • 原文地址:https://blog.csdn.net/weixin_62684026/article/details/126318102