题目链接
题目:
分析:
- 计算某个区间的积, 同样可以使用前缀和算法的思想
- 想要计算除i位置的积, 我们需要计算i位置之前[0,i-1]的前缀积 和 i位置之后[i+1,n-1]的后缀积, n表示数组的长度
-
先求[0,i - 1]的积 用一个前缀数组f
此时f[i] 表示: 前i - 1个数的积, 那么f[i - 1] 就表示前i - 2的积, 所以让f[0] = 1, i从1开始, 从前往后遍历
f[i] = f[i - 1] * nums[i - 1] -
求[i + 1,n - 1]的积 用一个后缀数组g
此时g[i] 表示: 后i + 1个数的积, 那么g[i + 1] 就表示后i + 2的积, 所以让g[n - 1] = 0, i从n-2开始, 从后往前遍历
g[i] = g[i + 1] + nums[i + 1] - 创建ret数组, 从头遍历数组, 记录下除i以外的积
代码:
class Solution {
public int[] productExceptSelf(int[] nums) {
int n = nums.length;
int[] f = new int[n];
int[] g = new int[n];
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 + 1] * nums[i + 1];
}
int[] ret = new int[n];
for (int i = 0; i < n; i++) {
ret[i] = g[i] * f[i];
}
return ret;
}
}