【剑指offer-52构建乘积数组】

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/5/21 下午4:02
# @Author : Yuxiaoxue# @Site : 
# @File : question1.py
# @Software: PyCharm

'''

题目描述
给定一个数组A[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[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)

'''
#这个是调试的,所以自己打了很多的输出

import copy
def multiply(A):
    n = len(A)
    print("A的长度是:", n)
    #需要注意的点在于列表的赋值操作,列表用B = A的话,就是A和B共用一套内存,A是值和B的值就是一致的
    B = copy.copy(A)
    print(B)

    for i in range(n):
        multy = 1
        for j in range(n):
            if i != j:
                print(i,j)
                multy *= A[j]
                print("multy",multy)
                B[i] = multy
                print("A[j]的值为", A[j])
                print("B[i]的值为",B[i])
        print("B[i]的最终值为", B[i])
    print(B)

A = [1,2,3,4,5]
print("A的长度:",len(A))
multiply(A)

'''
这是最终的通过的那个代码
import copy
class Solution:
    def multiply(self,A):
        n = len(A)
        #需要注意的点在于列表的赋值操作,列表用B = A的话,就是A和B共用一套内存,A是值和B的值就是一致的
        if n == 0:
            return []
        B = copy.copy(A)
        for i in range(n):
            multy = 1
            for j in range(n):
                if i != j:
                    multy *= A[j]
                    B[i] = multy
        return B

'''

以上是我自己在做题时候的思路,主要是用了双层嵌套循环去挨个求目标列表的值,下面是参考了书中的解题思路:

根据给出的形式可以把矩阵拆成上三角矩阵和下三角矩阵,A[i]看做值为1,分别求乘积后相乘:


n = 5:

下三角矩阵:
b[0] = 1;
b[1] = b[0] * a[0] = a[0];
b[2] = b[0] * a[0] * a[1] = a[0] * a[1];
b[3] = b[0] * a[0] * a[1] * a[2] = a[0] * a[1] * a[2]
b[n] = a[0] * ... * a[n-1];


tmp *= a[4] = a[4];
tmp = tmp * a[4];
b[3] = b[3] * tmp = a[0] * a[1] * a[2] * a[4]
tmp *= a[3] = a[4] * a[3];
b[2] = b[2] * tmp = a[4] * a[3] * a[1] * a[0]
tmp *= a[2] = a[4] * a[3] * a[2];
b[1] = b[1] * tmp = a[0] * a[2] * a[3] * a[4]
tmp *= a[1] * a[2] * a[3] * a[4]
b[0] = b[0] * tmp = a[1] * a[2] * a[3] * a[4]

#下面是剑指offer中给出的解题思路
import copy
def multiply(A):
    n = len(A)
    B = copy.copy(A)
    for i in range(1,n):
        B[i] = B[i-1] * A[i-1]
    tmp = 1
    for i in range(n-2,-1,-1):
        tmp *= a[i+1]
        B[i] = B[i] * tmp
    return B

 

posted @ 2020-06-04 23:29  于小雪  阅读(69)  评论(0)    收藏  举报