为了深入了解这些生物群体的生态特征,你们进行了大量的实地观察和数据采集。数组 arrayA 记录了各个生物群体数量数据,其中 arrayA[i] 表示第 i 个生物群体的数量。请返回一个数组 arrayB,该数组为基于数组 arrayA 中的数据计算得出的结果,其中 arrayB[i] 表示将第 i 个生物群体的数量从总体中排除后的其他数量的乘积。

示例 1:

**输入:**arrayA = [2, 4, 6, 8, 10]
输出:[1920, 960, 640, 480, 384]

提示:

所有元素乘积之和不会溢出 32 位整数

arrayA.length <= 100000

因为生物群体数量可能为0,所以我们无法直接使用除法。

首先可以分类讨论:1. 没有零:全部数乘积除以当前数;2. 一个零:其他位置为零,零元素为非零相乘;3. 多个零:都为零;

暴力解法每次遍历只能求出一个数,我们可以考虑以当前元素为分界点。

每个结果都是左区间的数乘右区间的数,并且对于B[i]的左区间有B[i+1]=B[i]*A[i-1],右区间同理

所以可以两次遍历分别求左区间和右区间,每次遍历可直接求出所有位置的左/右区间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
vector<int> statisticalResult(vector<int> &arrayA) {
if (arrayA.size() == 0)
return {};
vector<int> ans;
int mid = 1;
ans.push_back(mid);
for (int i = 1; i < arrayA.size(); i++) {
mid *= arrayA[i - 1];
ans.push_back(mid);
}

mid = 1;
for (int i = arrayA.size() - 2; i > 0; i--) {
mid *= arrayA[i + 1];
ans[i] *= mid;
}
mid *= arrayA[1];
ans[0] *= mid;
return ans;
}
};