📅  最后修改于: 2023-12-03 15:41:09.491000             🧑  作者: Mango
给定一个长度为n的整数数组nums,其中n > 1,返回输出数组output,使得output[i]等于nums中除nums[i]之外其余各元素的乘积。
例如,输入整数数组为[1, 2, 3, 4],则输出数组应为[24, 12, 8, 6]。
请不要使用除法,且在O(n)时间复杂度内完成此题。
我们可以将乘积分为左右两部分:
那么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)的复杂度中。同时,本题也充分考察了对数组索引的运用和数组元素的遍历,是一道不错的算法题目。