[LeetBook]【学习日记】数组内乘积

发布于:2024-03-05 ⋅ 阅读:(51) ⋅ 点赞:(0)

题目

按规则计算统计结果

为了深入了解这些生物群体的生态特征,你们进行了大量的实地观察和数据采集。数组 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 元素乘积后分情况讨论

  1. 先计算所有非 0 元素的乘积
  2. 如果有大于一个 0,则数组B 全为 0
  3. 小于等于一个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/


网站公告

今日签到

点亮在社区的每一天
去签到