题目:
给定一个数组 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