1. 算法问题解析
今天我们来探讨一个经典的数组操作问题:如何计算数组中每个元素除自身外所有其他元素的乘积。这个问题看似简单,但要想出最优解却需要一些巧妙的思路。
问题的正式描述是:给定一个整数数组nums,返回一个数组ans,其中ans[i]等于nums中除nums[i]之外所有元素的乘积。题目要求不能使用除法运算,并且在O(n)时间复杂度内完成。
举个例子,如果输入数组是[1,2,3,4],那么输出应该是[24,12,8,6]。因为:
- 第一个元素1的结果是2×3×4=24
- 第二个元素2的结果是1×3×4=12
- 以此类推
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法与优化思路
2.1 直观的暴力解法
最直观的解法是对每个元素,遍历整个数组计算其他所有元素的乘积:
python复制def productExceptSelf(nums):
n = len(nums)
ans = [1] * n
for i in range(n):
for j in range(n):
if j != i:
ans[i] *= nums[j]
return ans
这种方法的时间复杂度是O(n²),对于大数组来说效率太低。我们需要寻找更优的解法。
2.2 除法方法的局限性
有人可能会想到先计算所有元素的乘积,然后对每个元素用总积除以它本身:
python复制def productExceptSelf(nums):
total = 1
for num in nums:
total *= num
return [total // num for num in nums]
但这种方法有两个问题:
- 题目明确要求不能使用除法
- 当数组中有0时,这种方法会出错(除以0的错误)
3. 前缀积与后缀积解法
3.1 核心思路
更聪明的方法是使用前缀积和后缀积的概念:
- 前缀积:某个元素左侧所有元素的乘积
- 后缀积:某个元素右侧所有元素的乘积
对于数组中的每个元素,它的结果就是它的前缀积乘以后缀积。
3.2 具体实现步骤
- 创建两个辅助数组pre和back
