剑指 Offer 14- II. 剪绳子 II

n在[2,1000]之间,存在大数问题

贪心算法

思路

将n分解为a个3,其余数为p;

  • p==0时,则14-  ☆☆剪绳子 II - 图1;
  • p==1时,则14-  ☆☆剪绳子 II - 图2; 显然4>1*3;
  • p==2时,则14-  ☆☆剪绳子 II - 图3; 显然5<2*3;

实现

  1. //循环求余法
  2. int mod=1e9+7;
  3. int cuttingRope(int n){
  4. int ret=1;
  5. while(n>4){
  6. ret=(ret*3)%mod;
  7. n-=3;
  8. }
  9. return ret*n%mod;
  10. }

复杂度分析

  • 时间复杂度:14-  ☆☆剪绳子 II - 图4
  • 空间复杂度:14-  ☆☆剪绳子 II - 图5

❤❤❤快速幂求余

思路

Screenshot from 2020-10-24 12-26-43.png

实现

  1. int mod=1e9+7;
  2. int cuttingRope(int n){
  3. long ret=1;
  4. int a=n/3,p=n%3;
  5. long x=3;
  6. if(p==2) {
  7. a-=1;
  8. p=4;
  9. }
  10. while(a>0){
  11. if(a&1) ret=(ret*x)%mod;
  12. x=(x*x)%mod;
  13. a>>=1;
  14. }
  15. if(p) ret=(ret*p)%mod;
  16. return ret;
  17. }

复杂度分析

  • 时间复杂度:14-  ☆☆剪绳子 II - 图7
  • 空间复杂度:14-  ☆☆剪绳子 II - 图8

题目标题难度划分

星级 题目难度
简单
☆☆ 中等
☆☆☆ 困难

算法掌握难度程度划分

星级 掌握难度
普通
经典,易掌握
❤❤ 经典,略难掌握
❤❤❤ 困难