构建乘积数组

  1. 题目描述
    1. 思路1 减少溢出风险
    2. 思路1

题目描述

给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。

思路1 减少溢出风险

  • 顺序逐个求累积,最后一个不要乘,这样每一个累积都少一个数
  • 倒序逐个求累积,逐个乘以逆序累积,少一位

思路1

  • 顺序逐个求累积,每个都乘,求总乘积
  • 逐个除去当前的元素,剩下的每个元素就是B数组的元素

原始: 2   3   4   5   6
顺序: 1   2   6   24  120
逆序: 360 120 30  6   1
B:    360 240 180 144 120
class Solution {
public:
    vector<int> multiply(const vector<int>& A) {
        vector<int> vec;
        int sz=A.size();
        // 异常处理
        if(sz==0)
             return vec;
        vec.push_back(1);
        
        // 顺序累计求乘积,少一个元素
        for(int i=0;i<sz-1;i++)
             vec.push_back(vec.back()*A[i]);
        
        // 倒序累计求乘积
        int tmp=1;
        for(int i=sz-1;i>=0;i--)
        {
              vec[i]=vec[i]*tmp;//少一个元素
              tmp=tmp*A[i];
        }
        return vec;
    }
};

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

文章标题:构建乘积数组

字数:281

本文作者:攀登

发布时间:2019-12-26, 23:12:31

最后更新:2024-06-15, 15:53:35

原始链接:http://jiafeimao-gjf.github.io/2019/12/26/sword-%E6%9E%84%E5%BB%BA%E4%B9%98%E7%A7%AF%E6%95%B0%E7%BB%84/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

×

喜欢就点赞,疼爱就打赏