leetcode__除自身以外数组的乘积__python

解题思路:

先正向保存累乘结果,再反向保存累乘结果,再将对应的值乘起来能得到最终的结果,append到res中即可。
具体代码如下:

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        forward = []
        backward = []
        tmp = 1
        for num in nums:
            forward.append(tmp)
            tmp = tmp * num
        tmp = 1
        for num in nums[::-1]:
            backward.append(tmp)
            tmp = tmp * num
        backward.reverse()
        res = []
        for i in range(len(nums)):
            res.append(forward[i] * backward[i])
        return res

进阶解法:

只能用空间复杂度为O(1)的解法。
有了以上的解法思路,进阶解法就同样不难得到,只需要直接设置一个res,想将前向的累乘的值push进去,然后再反向计算累乘值的时候从res的尾部开始乘就一样能得到对应的结果了。
具体代码如下:

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        res = []
        tmp = 1
        for num in nums:
            res.append(tmp)
            tmp = tmp * num
        tmp = 1
        ptr = len(res) - 1
        for num in nums[::-1]:
            res[ptr] *= tmp
            tmp = tmp * num
            ptr -= 1
        return res

这里不考虑res的空间,只用到了tmp和ptr两个int型的变量,时间复杂度依旧还是O(n),空间复杂度为O(1)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值