剑指 Offer 14- I. 剪绳子

剑指 Offer 14- I. 剪绳子

链接:https://leetcode-cn.com/problems/jian-sheng-zi-lcof/

 

用算法几何不等式,m个数字和是一定的情况下,要想使得乘积是最大的,这m个数字肯定是相等的,然后考虑相等的时候利用求导得出最小值(https://leetcode-cn.com/problems/jian-sheng-zi-lcof/solution/mian-shi-ti-14-i-jian-sheng-zi-tan-xin-si-xiang-by/),可以知道最优剪绳长度为3,这个时候分三种情况:

1.n%3 == 0,最大乘积为3**(n//3)

2.n % 3 == 1, 因为3*1 < 2*2 所以应该将分出一个3加上余出来的1剪成两个长度为2的:3**(n//3-1)*4

3.n%3 == 2,最大乘积为:3**(n//3)*2

时间复杂度:O(1), 求余和幂运算都是O(1),

Python 中常见有三种幂计算函数(https://leetcode-cn.com/problems/jian-sheng-zi-lcof/solution/mian-shi-ti-14-i-jian-sheng-zi-tan-xin-si-xiang-by/): * 和 pow() 的时间复杂度均为 O(\log a)O(loga) ;而 math.pow() 始终调用 C 库的 pow() 函数,其执行浮点取幂,时间复杂度为 O(1)

空间复杂度:O(1)

class Solution:
    def cuttingRope(self, n: int) -> int:
        import math
        if n <= 3:
            return (n-1)
        if n%3 == 0:
            return int(math.pow(3, n//3))
        elif n%3 == 1:
            return int(math.pow(3, (n//3)-1) * 4)
        else:
            return int(math.pow(3, (n//3)) * 2)

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值