力扣刷题Python笔记:除自身以外数组的乘积

题目

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

力扣刷题Python笔记:除自身以外数组的乘积_第1张图片
提示:
题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。

说明:
请不要使用除法,且在 O(n) 时间复杂度内完成此题。

进阶:
你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

来源:力扣(LeetCode)

Python解法

暴力解法

这道题最容易想到的是暴力解法,创建结果数组 result,初始化长度等于 nums 的长度,初始化元素值均为1。
利用枚举函数遍历数组 nums 中的元素,然后内循环遍历结果数组 result 的索引,当外循环的索引和内循环的索引不相等时,将 nums 对应位置的元素与 result 对应位置的元素相乘并更新 result 对应位置的元素。

代码如下:

def productExceptSelf(self, nums: List[int]) -> List[int]:
    length = len(nums)
    result = [1]*length
    for index, element in enumerate(nums):
        for i in range(length):
            if i != index:
                result[i] *= element
    return result

虽然代码空间复杂度满足要求,但是时间复杂度为 O(n2),代码超时。

矩阵解法

题解中用了一种很巧妙的矩阵解法,将结果数组 res 表示成乘积形式,不同的 n 组成每行内容,形成一个矩阵,可以发现矩阵主对角线全部为 1 (当前数字不相乘,等价为乘 1),因此,我们分别计算矩阵的 下三角 和 上三角,并且在计算过程中储存过程值,最终可以在遍历 2 遍 nums 下完成结果计算。

力扣刷题Python笔记:除自身以外数组的乘积_第2张图片
代码如下:

def productExceptSelf(self, nums: List[int]) -> List[int]:
    res, p, q = [1], 1, 1
    for i in range(len(nums) - 1): # bottom triangle
        p *= nums[i]
        res.append(p)
    for i in range(len(nums) - 1, 0, -1): # top triangle
        q *= nums[i]
        res[i - 1] *= q
    return res

你可能感兴趣的:(力扣python刷题,算法)