📜  算法|杂项|问题13(1)

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

算法|杂项|问题13

问题描述

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

例如,输入整数数组为[1, 2, 3, 4],则输出数组应为[24, 12, 8, 6]。

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

解法说明

我们可以将乘积分为左右两部分:

  1. 数组前半部分元素的乘积
  2. 数组后半部分元素的乘积

那么output[i]即为前半部分元素的乘积与后半部分元素的乘积的乘积。因此,我们只需要先遍历一遍nums数组,求得每个元素左边的乘积,再遍历一遍数组求得每个元素右边的乘积,然后将左右两边的乘积相乘即可得到结果。

具体实现过程如下:

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        n = len(nums)
        left = [1]*n
        right = [1]*n

        # 计算左边的乘积
        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]

        # 计算答案
        ans = [left[i]*right[i] for i in range(n)]
        return ans

其中,left数组存储每个元素左边的乘积,right数组存储每个元素右边的乘积,最终计算ans数组的每个元素即可。

总结

本题的解法是比较巧妙的,利用了两次遍历数组的方式,将一个复杂度为O(n^2)的问题简化到O(n)的复杂度中。同时,本题也充分考察了对数组索引的运用和数组元素的遍历,是一道不错的算法题目。