题目
按规则计算统计结果
为了深入了解这些生物群体的生态特征,你们进行了大量的实地观察和数据采集。数组 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,且只有一个0和大于一个0这两种情况的结果还不一样,需特别注意
解法1:利用除法,计算所有非 0 元素乘积后分情况讨论
- 先计算所有非 0 元素的乘积
- 如果有大于一个 0,则数组B 全为 0
- 小于等于一个0,则根据要填入的位置上对应数组A 的元素是否为 0 分类讨论
vector<int> statisticalResult(vector<int>& arrayA) {
int product = 1;
bool have1Zero = false, have2Zero = false;
for(auto &ele: arrayA){
if(ele) product *= ele;//计算出所有非0元素的乘积
else{
if(have1Zero == true) have2Zero = true;//多于一个0
have1Zero = true; //必有一个0
}
}
vector<int> B;
if(!have2Zero){// <=一个0,分情况填入
for(auto &ele: arrayA){
if(!ele) B.push_back(product);
else if(have1Zero) B.push_back(0);
else B.push_back(product/ele);
}
}
else{//多于一个0,则输出全为0
for(auto &ele: arrayA){
B.push_back(0);
}
}
return B;
}
解法2:只利用乘法
https://leetcode.cn/leetbook/read/illustration-of-algorithm/lhiayd/