题目描述
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请 不要使用除法,且在 O(n) 时间复杂度内完成此题。
实现步骤概述
- 初始化结果数组 answer,其长度与输入数组 nums 相同,初始值均为 1。
- 计算每个元素左侧的乘积,并将结果存储在 answer 数组中。
- 计算每个元素右侧的乘积,并将其与 answer 数组中的左侧乘积相乘,得到最终结果。
代码
from typing import List
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
"""
计算数组中每个元素除自身外的所有元素的乘积
:params nums: List[int] - 输入的整数数组
:return: List[int] - 输出的结果数组
"""
n = len(nums) # 获取输入数组的长度
answer = [1] * n # 初始化结果数组,长度与输入数组相同,初始值均为1
# 计算左侧乘积并存储在结果数组中
left_product = 1 # 初始化左侧乘积为1
for i in range(n):
answer[i] = left_product # 将当前的左侧乘积存储在结果数组中
left_product *= nums[i] # 更新左侧乘积
# 计算右侧乘积并与结果数组中的左侧乘积相乘
right_product = 1 # 初始化右侧乘积为1
for i in range(n - 1, -1, -1): # 从右向左遍历输入数组
answer[i] *= right_product # 将右侧乘积与结果数组中的左侧乘积相乘
right_product *= nums[i] # 更新右侧乘积
return answer # 返回最终结果数组
nums = [1, 2, 3]
a = Solution()
print(a.productExceptSelf(nums)) # 输出: [6, 3, 2]
代码解析
- 计算左侧乘积:
对于每个元素,计算其左侧所有元素的乘积,并存储在 answer 数组中。 - 计算右侧乘积并与左侧乘积相乘:
对于每个元素,计算其右侧所有元素的乘积,并与之前存储在 answer 数组中的左侧乘积相乘,得到最终结果。
知识点总结
使用了前缀积和后缀积的方法,避免了使用除法。
通过两次遍历数组,计算每个元素的左侧乘积和右侧乘积,再通过一次遍历计算结果数组。
时间复杂度为 O(n),空间复杂度为 O(n)。