剑指offer14-2

剑指 Offer 14- II. 剪绳子 II

题目:

在这里插入图片描述

思路:

区别于DP,使用贪婪算法。3就是最贪婪的,但是对于4,不能使用33,而是要使用22,所以进行了特殊处理。
注意:代码的实现,根据题意还是要考虑边界问题,可以在以下两点进行思考:
1.是不是要使用long
2.在那个位置进行取模是绝对正确的

代码:

class Solution {
    public int cuttingRope(int n) {
        if (n == 2) {
            return 1;
        } else if (n == 3) {
            return 2;
        }
        int c = n / 3;
        int d = n % 3;
        int result = 0;
        // 对于4,5, 6要进行特殊处理
        if (d == 1) {
            result = (int)(pow(3, c - 1) * 4 % 1000000007);
        } else if (d == 0) {
            result =  (int)pow(3,c);
        } else if (d == 2) {
            result = (int)(pow(3,c) * 2 % 1000000007);
        }
        return result;
    }

    private long pow(int i, int count) {
        int temp = i;
        //这个必须用long计算,否则结果不正确
        long j = i;
        if(count == 0){
            return 1;
        }
        while (--count > 0) {
            j *= temp ;
            j = j % 1000000007;
        }
        return j;
    }
}

在这里插入图片描述
空间复杂度不好的原因主要是由于 temp变量,将其写死为3,这里就会有提升。但是自己的代码实现有点复杂,参考其他答案的写法后:
1.将4,5,6的考虑不使用if,直接进行n-3
2.pow不复杂,也是整合到n-3中
但是代码实现简单:

class Solution {
    public int cuttingRope(int n) {
        if (n == 2) {
            return 1;
        } else if (n == 3) {
            return 2;
        }
        long result = 1;
        // 不自定义那么多的函数,直接进行-,* 即可
        while (n > 4) {
            result *= 3;
            result = result % 1000000007;
            n -= 3;
        }
        // 进行特殊处理,*2,*3等
        return (int) (result * n % 1000000007);
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值