Day14 构建乘积数组

题目:
给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。
leetcode原题链接

思路:

  • B[i]=A[0] * A[1] * …* A[i-1] * A[i+1] * … * A[n-1]
  • 将表达式拆分为前后两部分的乘积B[i]=mul_pre[i]*mul_pre[i]
    mul_pre[i]=A[0] * A[1] A[i-1]
    mul_hou[i]=A[i+1] * … * A[n-2] * A[n-1]
  • 尝试列出mul_pre[i-1]和mul_hou[i+1],可以发现
    mul_pre[i]=mul_pre[i-1]*a[i-1]
    mul_hou[i]=mul_hou[i+1]*a[i+1]
    前缀表达式[i]的值,可由前一个元素[i-1]的值推导 得到
    后缀表达式[i]的值,要由后一个元素[i+1]的值推到 得到
    我们用for循环和range函数来进行推导
    前缀表达式,从i=0到n-1遍历,递增,用range(n)表达即可【即range(0,n),步长默认为1,左起点闭右终点开】
    后缀表达式,从i=n-1到0遍历,递减,用range(n-1,-1,-1)表达【从i=n-1算起,由于递减,步长是-1,要遍历到i=0,所以终点设置为-1】

代码:
参考b站视频 AV412528378

class Solution:
    def constructArr(self, a: List[int]) -> List[int]:
        # mul_pre[i]=a[0]*...*a[i-1]
        # mul_hou[i]=a[i+1]*...*a[n-1]
        # B[i]=mul_pre[i]*mul_pre[i]
        
        # mul_pre[i]=mul_pre[i-1]*a[i-1]
        # mul_hou[i]=mul_hou[i+1]*a[i+1]
        n=len(a)
        mul_pre=[1]*n
        mul_hou=[1]*n
        B=[0]*n
        for i in range(n):
            if i==0:
                mul_pre[i]=1;#此时不存在前缀乘积,设为1即可,后面算结果是【后缀乘积】和1的乘积,1乘任何数还等于原来的数
            else:
                mul_pre[i]=mul_pre[i-1]*a[i-1]
        for i in range(n-1,-1,-1):#一定要注意这个递减range的写法
            if i==n-1:
                mul_hou[i]=1#此时不存在后缀乘积,设为1即可,后面算结果是【前缀乘积】和1的乘积,1乘任何数还等于原来的数
            else:
                mul_hou[i]=mul_hou[i+1]*a[i+1]
        for i in range(n):
            B[i]=mul_pre[i]*mul_hou[i]
        return B

待修改代码:
在这里插入图片描述

超时

class Solution:
    import functools
    def constructArr(self, a: List[int]) -> List[int]:
        n=len(a)
        res=[0]*n
        for i in range(n):
            tmp=a[i]
            a[i]=1
            res[i]=functools.reduce(lambda x,y:x*y,a)
            a[i]=tmp
        return res

针对测试用例修改代码,仍超时

class Solution:
    import functools
    def constructArr(self, a: List[int]) -> List[int]:
        n=len(a)
        res=[0]*n
        for i in range(n):
            if i>0:
                if a[i]==a[i-1]:
                    res[i]=res[i-1]
            tmp=a[i]
            a[i]=1
            res[i]=functools.reduce(lambda x,y:x*y,a)
            a[i]=tmp
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值