📜  门|门 IT 2007 |问题 22(1)

📅  最后修改于: 2023-12-03 15:42:22.012000             🧑  作者: Mango

门|门 IT 2007 | 问题 22

本次编程挑战是由门|门 IT 2007 出题,题目编号为问题 22。

题目描述

给定一个长度为 $n$ 的整数数组 $nums$,其中 $n > 1$,请返回一个数组 $output$,其中 $output[i]$ 等于 $nums$ 中除 $nums[i]$ 之外所有元素的乘积。

示例:

输入: [1,2,3,4] 输出: [24,12,8,6]

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

解法详解

这是一道经典的数组乘积问题,难点在于要求在 $O(n)$ 的时间复杂度内完成。由于不能使用除法,我们需要另外想到一种方法来计算每个元素除自己外其他元素的乘积。

我们可以考虑分别计算每个元素左侧所有元素和右侧所有元素相乘的结果。具体来说,对于数组中的第 $i$ 个元素,我们可以先计算出 $i$ 左侧所有元素的乘积,然后再计算出 $i$ 右侧所有元素的乘积,最后将两个结果相乘即可得到答案。

具体实现时,我们可以先构造两个长度为 $n$ 的数组 $left$ 和 $right$,其中 $left[i]$ 表示 $nums[0]$ 到 $nums[i-1]$ 中所有元素的乘积,即 $left[i] = nums[0] * nums[1] * ... * nums[i-1]$,同理 $right[i]$ 表示 $nums[i+1]$ 到 $nums[n-1]$ 中所有元素的乘积,即 $right[i] = nums[i+1] * nums[i+2] * ... * nums[n-1]$。然后我们只需要将两个数组对应位置的元素相乘即可得到最终答案。

时间复杂度为 $O(n)$。

代码示例
class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        n = len(nums)
        left, right, output = [0] * n, [0] * n, [0] * n
        left[0] = 1
        right[n-1] = 1

        for i in range(1, n):
            left[i] = left[i-1] * nums[i-1]

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

        for i in range(n):
            output[i] = left[i] * right[i]

        return output

以上是 Python 的代码实现示例,题解中的代码片段已按 markdown 标明。