剑指offer 66 - 构建乘积数组 - python

78 阅读1分钟

题目描述

给定一个数组 A [ 0 , 1 , . . . , n − 1 ] A[0,1,...,n-1] A[0,1,...,n−1],请构建一个数组 B [ 0 , 1 , . . . , n − 1 ] B[0,1,...,n-1] B[0,1,...,n−1],其中B中的元素 B [ i ] = A [ 0 ] ∗ A [ 1 ] ∗ . . . ∗ A [ i − 1 ] ∗ A [ i + 1 ] ∗ . . . ∗ A [ n − 1 ] B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1] B[i]=A[0]∗A[1]∗...∗A[i−1]∗A[i+1]∗...∗A[n−1]。不能使用除法。(注意:规定 B [ 0 ] = A [ 1 ] ∗ A [ 2 ] ∗ . . . ∗ A [ n − 1 ] , B [ n − 1 ] = A [ 0 ] ∗ A [ 1 ] ∗ . . . ∗ A [ n − 2 ] B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2] B[0]=A[1]∗A[2]∗...∗A[n−1],B[n−1]=A[0]∗A[1]∗...∗A[n−2];)

示例:

输入: [1,2,3,4,5]
输出: [120,60,40,30,24]

根据题意可知,B的每个位置的元素为A除去当前位置的所有位置元素的乘积,因此只需要构建一个索引列表,然后每次求B的元素时就从索引列表中除去当前索引,然后将其他位置对应元素相乘添加到B中。

# -*- coding:utf-8 -*-
class Solution:
    def multiply(self, A):
        # write code here
        if A == None:
        	return None
        	
        B = []
        for i in range(len(A)):
            num = 1
            for n in A[:i] + A[i + 1:]:
                num *= n
            B.append(num)
            
        return B

上面的代码牛客可以通过,但是leetcode会超时。正确的方式是使用左右乘积数组法,如下所示:

class Solution:
    def constructArr(self, a: List[int]) -> List[int]:
        n = len(a)
        L, R = [1] * n, [1] * n
        for i in range(1, n):
            L[i] = L[i - 1] * a[i - 1]
        for j in reversed(range(n - 1)):
            R[j] = R[j + 1] * a[j + 1]
        for i in range(n):
            L[i] = L[i] * R[i]
        return L