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

启发和联系