Leetcode Link: 238. 除自身以外数组的乘积 - 力扣(LeetCode) (leetcode-cn.com) 剑指 Offer 66. 构建乘积数组 - 力扣(LeetCode)
题目
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。

解法一
思路:考察前缀和后缀和。只要要遍历一次,求出前缀和后缀乘积即可
需要小心的是,在计算的时候为了后序使用方便,preMul[i] 是不包含当前位置的前缀和(积),postMul同理。此种情况下,对于 ans[i],就直接等于 preMul[i] * postMul[i]
题解:
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
preMul, postMul = [None]*len(nums), [None]*len(nums)
preMul[0], postMul[len(nums)-1] = 1, 1
for idx in range(1, len(nums)):
preMul[idx] = preMul[idx-1] * nums[idx-1]
postMul[len(nums)-1-idx] = postMul[len(nums)-1-idx+1] * nums[len(nums)-1-idx+1]
return list(map(lambda x,y: x*y, preMul,postMul))
# map 也能换成for循环来做或者原地乘出来也行
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
preMul, postMul = [None]*len(nums), [None]*len(nums)
preMul[0], postMul[len(nums)-1] = 1, 1
for idx in range(1, len(nums)):
preMul[idx] = preMul[idx-1] * nums[idx-1]
postMul[len(nums)-1-idx] = postMul[len(nums)-1-idx+1] * nums[len(nums)-1-idx+1]
for idx in range (len (nums)):
# 这里原地乘
preMul[idx] = preMul[idx]*postMul[idx]
return preMul