返回
算法:LeetCode 238. 除自身以外数组的乘积(Python 解法)
人工智能
2023-10-31 11:10:40
导语:
LeetCode 238 是一道经典的算法题,要求计算一个数组中除每个元素自身以外的所有元素的乘积。这道题的挑战在于不能使用除法,并且需要在 O(n) 的时间复杂度内完成计算。本文将提供 Python 代码,详细解析如何巧妙地利用左数组和右数组分别存储元素之前的乘积和元素之后的乘积,从而避免使用除法和双层循环。
算法原理:
为了避免使用除法,我们可以巧妙地利用左数组和右数组分别存储元素之前的乘积和元素之后的乘积。左数组的每个元素 nums[i] 表示 nums[0] 到 nums[i-1] 的乘积,右数组的每个元素 nums[i] 表示 nums[i+1] 到 nums[n-1] 的乘积。这样,我们可以通过访问左数组和右数组,轻松计算出除每个元素自身以外的所有元素的乘积。
Python 代码:
def productExceptSelf(nums):
"""
计算一个数组中除每个元素自身以外的所有元素的乘积。
Args:
nums: 输入数组。
Returns:
一个数组,其中每个元素表示相应元素除自身以外的所有元素的乘积。
"""
n = len(nums)
left_products = [1] * n
right_products = [1] * n
# 计算左数组
for i in range(1, n):
left_products[i] = left_products[i-1] * nums[i-1]
# 计算右数组
for i in range(n-2, -1, -1):
right_products[i] = right_products[i+1] * nums[i+1]
# 计算最终结果
result = []
for i in range(n):
result.append(left_products[i] * right_products[i])
return result
代码解析:
- 首先,我们分别初始化左数组和右数组,每个元素都初始化为 1。
- 然后,我们使用两个 for 循环分别计算左数组和右数组。对于左数组,我们从第二个元素开始,将前一个元素的乘积与当前元素相乘。对于右数组,我们从倒数第二个元素开始,将后一个元素的乘积与当前元素相乘。
- 最后,我们使用另一个 for 循环计算最终结果。对于每个元素,我们将其左数组的乘积与右数组的乘积相乘。
时间复杂度:
本算法的时间复杂度为 O(n),其中 n 是数组的长度。这是因为我们只遍历了数组一次,并且每个操作都是常数时间的。
总结:
本算法巧妙地利用左数组和右数组分别存储元素之前的乘积和元素之后的乘积,从而避免使用除法和双层循环。代码简洁高效,易于理解。