力扣链接:LCR 191. 按规则计算统计结果 - 力扣(LeetCode)
为了深入了解这些生物群体的生态特征,你们进行了大量的实地观察和数据采集。数组 arrayA
记录了各个生物群体数量数据,其中 arrayA[i]
表示第 i
个生物群体的数量。请返回一个数组 arrayB
,该数组为基于数组 arrayA
中的数据计算得出的结果,其中 arrayB[i]
表示将第 i
个生物群体的数量从总体中排除后的其他数量的乘积。
方法一:
class Solution {
public:
vector<int> statisticalResult(vector<int>& arrayA) {
std::vector<int> arrayB(arrayA.size(), 1);
int n = arrayA.size();
int sum = 1;
for (int i = 0; i < n; i++) {
sum = 1;
for (int j = 0; j < n; j++) {
if (j != i) {
sum *= arrayA[j];
}
}
arrayB[i] = sum;
}
return arrayB;
}
};
最基本的思路,使用双层循环,分别相乘。最后结果失败(超限)。主要是双层循环 时间复杂度太大。
方法二:
class Solution {
public:
vector<int> statisticalResult(vector<int>& arrayA) {
int i,sum=1,sum1=1,j=0;
int n = arrayA.size();
for(i=0;i<n;i++){
sum *= arrayA[i];
if(arrayA[i] != 0){
sum1 *= arrayA[i];
}
}
for(i=0;i<n;i++){
if(arrayA[i] == 0){
j++;
}
}
if(j>1){
return std::vector<int>(n, 0);
}
for(i=0;i<n;i++){
if(arrayA[i] != 0){
arrayA[i] = sum /arrayA[i];
}else{
arrayA[i] = sum1;
}
}
return arrayA;
}
};
这种方法的核心思想就是以零的数量将数组分为三种情况(没有0,一个0,两个0),当数组有两个零时直接返回全零数组,当数组没有零时,可以先求出整个数组的乘积,在将乘积分别除以对应位的数组元素。 当只有一个零时,我们求出非零乘积,将其赋给对应位。
方法三(大佬思路):
vector<int> constructArr(vector<int>& a) {
int len = a.size();
int temp=1;
vector<int> b(len);
for(int i=0;i<len;temp*=a[i],++i)
b[i] = temp;
temp=1;
for(int i=len-1;i>=0;temp*=a[i],--i)
b[i] *=temp;
return b;
}
将一个数组分为两段,一个从左往右乘,一个从右往左乘,没有第一种的高时间复杂度,也不需要考虑第二种的特殊情况,总之很牛*。