一、题目
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。
说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。
进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)
二、思路
方法一:遍历列表,将当前元素变为1,然后整个列表所有元素求乘积,将结果放入新空间中即可
优点:是我自己的第一思路,更简单,更容易理解。
缺点:超出时间限制,时间复杂度为O(N^2)。空间复杂度为O(N),不满足进阶要求。无法通过提交。
代码:
from functools import reduce
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
res=[]
for i in range(len(nums)):
a=nums[i]
nums[i]=1
res.append(reduce(lambda x,y:x*y,nums))
nums[i]=a
return res
方法二:根据官方答案给的思路。同样是先遍历列表,以当前元素为基准,分别计算其左右列表的乘积,最后将左右合并即可。(程序方法是正序遍历+倒序遍历)
优点:完美符合题目所有要求。
缺点:代码思路较难,比较绕。不好写。
代码:
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
res=[None]*len(nums)
k=1
for i in range(len(nums)):
res[i]=k
k*=nums[i]
k=1
for i in range(len(nums)-1,-1,-1):
res[i]*=k
k*=nums[i]
return res
三、补充
方法一中用到的reduce(),在python3中已经被取消,如果需要用,必须在开头引用库
from functools import reduce。其作用是将括号中的内容进行累积。