码迷,mamicode.com
首页 > 编程语言 > 详细

构建乘积数组

时间:2019-01-28 13:58:27      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:mes   end   div   bubuko   图片   public   size   class   out   

题目

  给定一个数组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]。不能使用除法。

思路

  把B[i]=A[0]*A[1]*.....*A[i-1]*A[i+1]*.....*A[n-1]。看成A[0]*A[1]*.....*A[i-1]和A[i+1]*.....A[n-2]*A[n-1]两部分的乘积。

技术分享图片

  不妨设定C[i]=A[0]*A[1]*...*A[i-1],D[i]=A[i+1]*...*A[n-2]*A[n-1]。C[i]可以用自上而下的顺序计算出来,即C[i]=C[i-1]*A[i-1]。类似的,D[i]可以用自下而上的顺序计算出来,即D[i]=D[i+1]*A[i+1]。

技术分享图片

#include <iostream>
#include <vector>
using namespace std;

class Solution
{
    public:
        vector<int> multiply(const vector<int> &a); 
};
vector<int> Solution::multiply(const vector<int> &a)
{
    vector<int> b(a.size(),1);
    if(a.empty()||a.size()<0)
        return b;
        
    b[0]=1;
    for(int i=1;i<a.size();++i)//计算上三角,计算上图1的范围 
        b[i]*=b[i-1]*a[i-1];
    
    int temp=1;
    for(int i=a.size()-2;i>=0;--i)//计算下三角,计算上图2的范围 
    {
        temp*=a[i+1];
        b[i]*=temp;    
    }
    return b;
}
int main()
{
    vector<int> a{1,2,3,4,5,6,7,8,9};
    Solution s;
    vector<int> b=s.multiply(a);
    for(auto v:b)
        cout<<v<< ;
    cout<<endl; 
    return 0;
}

 

构建乘积数组

标签:mes   end   div   bubuko   图片   public   size   class   out   

原文地址:https://www.cnblogs.com/tianzeng/p/10329663.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!