leetcode刷题 构建乘积数组

给你一根长度为 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。

 

解题思路:

        这里用到了一个数学思路:当n个数相加的和固定时(设目标和为target),要让这n个数的乘积最小,则必须让这n个数尽量接近。如:将9分成3个数的和,当3个数同时为3时,它们的积为27最大,因为此时三个数相等,相互之间最为接近。

        但若n个数不能完全一样该怎么办,此时可以先找出n个相同的数让他们的和尽量大但小于target。设这n个数均为a,则可得a=target//n(整除取整数部分);此外设target%n=b(取余数),则b就是n个a相加后与target的差值,因此可以从n个a中选出b个依次增加1,这样就有了b个(a+1)和n-b个a,这样就满足了它们和为target且它们之间尽量靠近。

代码如下:

class Solution:
    def cuttingRope(self, n: int) -> int:
        self.res=0
        for i in range(2,n+1):#将绳子切成i份,每一份的数字尽量接近才能使乘积最小
            self.quotient=n//i
            self.remainder=n%i
            self.tempNum=pow(self.quotient+1,self.remainder)*pow(self.quotient,(i-self.remainder))
            self.res=max(self.res,self.tempNum)
        return self.res

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值