构建乘积数组

  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

💰

Title:构建乘积数组

Count:281

Author:攀登

Created At:2019-12-26, 23:12:31

Updated At:2024-06-15, 15:53:35

Url: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/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

×

Help us with donation