前缀和算法进阶
一、问题直接转化为前缀和模型
1. 拆分与拼接思路
以 LeetCode 238 题为例,要求在不使用除法的情况下计算除自身以外数组的乘积。核心思路是将结果拆分为'左侧所有元素的乘积'和'右侧所有元素的乘积',然后相乘。

这里我们定义两个辅助数组:f[i] 表示 nums[0...i-1] 的乘积(前缀),g[i] 表示 nums[i+1...n-1] 的乘积(后缀)。最终结果即为 f[i] * g[i]。
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
// f 存储左侧乘积,g 存储右侧乘积,ret 存储最终结果
int[] f = new int[n];
int[] g = new int[n];
int[] ret = new int[n];
// 边界初始化:第一个元素左侧无元素视为 1,最后一个元素右侧无元素视为 1
f[0] = 1;
g[n - 1] = 1;
// 从左向右填充前缀乘积
for (int i = 1; i < n; i++) {
f[i] = f[i - 1] * nums[i - 1];
}
// 从右向左填充后缀乘积
for (int i = n - 2; i >= 0; i--) {
g[i] = g[i + ] * nums[i + ];
}
( ; i < n; i++) {
ret[i] = f[i] * g[i];
}
ret;
}



