leetcode238.除自身以外数组的乘积(Python实现)

题目:除自身以外数组的乘积
来源:Leetcode
在这里插入图片描述
咋一看这道题似乎非常简单,直接用整个数组的乘积除去当前元素不就好了吗,但题目中是有限制不能使用除法的,而且这种做法也是有风险的,一旦出现 0 就失效了。同时,题目还规定,除了输出数组外,我们只能使用常数个空间。那么,我们应该如何思考呢?

左右数组乘积

我们设想下,如果我们能将该数组分为两个部分,一部分是当前元素的左边所有的元素,另一部分是当前元素右边所有的元素,那么,在求除当前元素外数组中所有元素的积时,我们只需要将左部分乘积乘上右部分乘积即可。

但是,题目中要求除掉输出数组,仅可使用常数级空间,因此,我们需要借助数组数组来保存左右两半部分乘积(实际上,只需要保存左半部分乘积即可,因为从右开始遍历时,我们只需要用一个变量保存右边元素的乘积即可)
代码实现过程:

  1. 先从左到右遍历,ans[i] 中存放 [0, i-1] 部分乘积
  2. 再从右至左遍历,用一个变量 right 存放 [i, n] 部分乘积
  3. ans[i] * right 即为所求结果

代码如下:

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        ans = [1]
        left = nums[0]
        for l in range(1, len(nums)):
            ans.append(left)
            left *= nums[l]
        right = 1
        for r in range(len(nums)-1, -1, -1):
            ans[r] = right * ans[r]
            right *= nums[r]
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值