.238.除自身以外数组的乘法

本文介绍了在Python中计算数组中除自身以外所有元素乘积的三种方法:1)通过牺牲时间换取空间,使用两个for循环;2)优化空间复杂度,使用前缀积和后缀积数组;3)兼顾时间和空间,利用动态字母记录后缀积。作者详细解释了每种方法的原理和代码实现。
摘要由CSDN通过智能技术生成

·题目描述

·解题思路:

————————时间换空间(for循环暴力求解)————————

1.两个for循环不断乘积

2.稍作优化——先判断是否有0存在,若是在乘积的余下数组中有0直接判断为0 (但是只是最优时间复杂度减少,没什么大作用)

代码:


class Solution(object):
    def productExceptSelf(self, nums):
        #牺牲时间换空间
        n = len(nums)
        res = [0] * n

        for i in range(n):
            multiply = 1
            if 0 in nums[:i] or 0 in nums[i+1:]:
                multiply = 0

            for j in range(n):
                if j == i:
                    multiply *= 1
                else:
                    multiply *= nums[j]

            res[i] = multiply

        return res

————————牺牲空间换时间(两个额外数组空间,记录前缀积和后缀积)——————

1.利用pre数组记录每个元素的前缀积,pre[0]= 1     (图解如下,来源力扣官网)

2.利用post数组记录后缀积,post[-1]= 1     (图解)

3.将pre和post两个数组对应元素相乘所得数据就是最后的结果,直接放到nums原始数组的对应位置上,即可

代码:


    def productExceptSelf(self, nums):

        #牺牲空间换时间
        n = len(nums)
        pre ,post = [0] * n, [0] * n
        pre[0] , post[n-1] = 1 , 1
        for i in range(n-1):
            pre[i + 1] = nums[i] * pre[i]

        for j in range(n-1 , 0 , -1):
            post[j - 1] = post [j] * nums[j]

        for i in range(n):
            nums[i] = pre[i] * post [i]

        return nums

—————————兼顾时间和空间————————

1.将两个数组pre和post压缩为一个数组result

2.先用result记录原始的前缀积,步骤同上

3.利用动态字母R,记录后缀积。因为每个元素的前缀积已经记录,后缀积不断从后往前移动并且相乘更新R的值即可

(同样的思路,也可以先用resul记录后缀积,动态字母L记录前缀积,L从前往后移动即可)

代码:

    def productExceptSelf(self, nums):
           ##兼顾时间和空间
        n = len(nums)
        result = [0] * n
        result[0] = 1

        for i in range(n-1):
            result[i+1] = nums[i] * result[i]

        R = 1
        for j in range(n-1, -1,-1):
            result[j] = result[j] * R
            R *= nums[j]

        return result

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值