剑指Offer 66. 【不能使用除法】构建乘积数组(Easy)

剑指Offer 66. 构建乘积数组(Easy)

在这里插入图片描述
【题目链接】

题解

  1. 构建乘积数组(表格分区,清晰图解)

思路

在这里插入图片描述

代码

class Solution(object):
    ### 0907 直接遍历(超时)
    # def constructArr(self, a):
    #     """
    #     :type a: List[int]
    #     :rtype: List[int]
    #     """
    #     ret_ls = []
    #     for i in range(len(a)):
    #         v = 1
    #         for j in range(len(a)):
    #             if j == i:
    #                 continue
    #             v *= a[j]
    #         ret_ls.append(v)
    #     return ret_ls

    ### 0907 乘积数组法
    def constructArr(self, a):
        # 新建一个数组并初始化为全1(用于记录顺序值的累乘,即i左边值的累乘)
        # 新建一个辅助变量初始化为1(用于记录逆序值的累乘,即i右边值的累乘)
        b, tmp = [1] * len(a), 1 

        # 计算矩阵的下三角部分,b[0]只需计算i右边值的累乘即可
        for i in range(1, len(a)): # 
            b[i] = b[i-1] * a[i-1] # 自上而下依次计算i左边的每个累乘值(此时b用于暂存)
        
        # 计算矩阵的上三角部分,b[n-1]只需计算i左边值的累乘即可
        for i in range(len(a)-2, -1, -1): 
            tmp *= a[i+1] # 自下而上依次计算i右边的每个累乘值
            b[i] *= tmp   # 左边的累乘值 * 右边的累乘值
        
        return b
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值