LeetCode第321题:创建乘积数组:LeetCode平台上的第321题是一道关于数组操作的算法问题。题目要求根据给定的数组nums,创建一个新的数组target,使得target[i]等于原数组中除i位置元素之外的所有元素的乘积。换句话说,新数组中的每个值表示原数组中不包含当前索引元素的乘积。例如,如果nums = [1, 2, 3, 4],那么target应该是[24, 12, 8, 6]。这道题目考察的是数组处理和动态规划的概念。解决这个问题时,可以采用前缀和或后缀和的方法,或者使用两个辅助数组分别存储到当前位置为止的乘积和从当前位置到末尾的乘积。这有助于在O(n)的时间复杂度内完成任务,同时保持空间复杂度为O(1)。

解题思路:

  1. 初始化两个数组prefixProductsuffixProduct,大小与nums相同,且所有元素初始化为1。

  2. 遍历nums,对于每个i,更新prefixProduct[i]prefixProduct[i-1] * nums[i]prefixProduct保存从0到i位置的乘积。

  3. 从后向前遍历nums,更新suffixProduct[i]suffixProduct[i+1] * nums[i]suffixProduct保存从i到末尾的乘积。

  4. 创建新数组target,对于每个itarget[i]设置为prefixProduct[i-1] * suffixProduct[i]

Python代码实现:


def createTargetArray(nums, index):

    prefixProduct = [1] * len(nums)

    suffixProduct = [1] * len(nums)

    for i in range(1, len(nums)):

        prefixProduct[i] = prefixProduct[i - 1] * nums[i]

    for i in range(len(nums) - 2, -1, -1):

        suffixProduct[i] = suffixProduct[i + 1] * nums[i]

    target = [prefixProduct[i - 1] * suffixProduct[i] for i in index]

    return target