剑指 Offer 14- II. 剪绳子 II

1.题目

2.思路

这道题和剪绳子I 几乎一样,唯一的区别在于这里需要取模 int mod = (int)1e9 + 7;

一开始本来打算跟剪绳子I一样的做法,遍历一遍可能可以剪的次数cnt, 对于每个次数cnt(比如11) ,判断一下能否除尽,能整除直接就可以求幂,不能整除比如6.666,就可以拆成两种情况,一种是10个6,和1个余数;或者10个7和1个余数(为负数,就舍弃),找一个最大值。----这样有问题,可能是数据溢出的问题。

正确解法--贪心 (证明可以去看官方题解)

来几个例子说明为什么优先剪成长度为3的大小。

特例:

n = 2, 剪成 1 * 1 = 1;

n = 3, 剪成 1 * 2 = 2;

n = 4, 剪成 2 * 2;

n > 4--都是优先保证先剪成3

n = 5, 3 * 2;

n = 6,3 * 3;

n = 7, 3 * 4 = 3 * 2 *2

n = 8,3 * 3 * 2;

注意:最后一个数跳出循环是while(n  > 4)

class Solution {
    public int cuttingRope(int n) {
        // 贪心:优先拆成3,没有就拆成2
        if(n == 2)return 1;
        if(n == 3)return 2;
        if(n == 4)return 4;
        int mod = (int)1e9 + 7;
        long ans = 1;
        while(n > 4){
            ans *= 3;
            ans %= mod;
            n -= 3;
        }
        ans *= n;
        ans %= mod;

        return (int)ans;
    }
}

3.结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值