面试题66:构建乘积数组(C++)

题目地址:https://leetcode-cn.com/problems/gou-jian-cheng-ji-shu-zu-lcof/

题目描述

给定一个数组 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,2,3,4,5]
输出: [120,60,40,30,24]

解题思路

分析题目,我们发现B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]是A[i]左边所有元素与A[i]右边所有元素乘积,所以,我们可以用两个数组C、D分别存放A[i]左边所有元素乘积与A[i]右边所有元素乘积,最后,数组B[i]=C[i] * D[i],其中,C[i]表示a数组从第0项乘到i-1项的乘积,其值,C[i] = C[i-1] * a[i-1],D[i]表示从i+1到n-1项的乘积,其值D[i]=D[i+1]*A[i+1]

程序源码

class Solution {
public:
    vector<int> constructArr(vector<int>& a) {
     if(a.empty()) return {};
int len = a.size(); vector<int> b(len, 1); //B[i] = C[i] * D[i] vector<int> c(len, 1); //A[i]左边元素乘积,即下三角 vector<int> d(len, 1); //A[i]右边元素乘积,即上三角 for(int i = 1; i < len; i++) { c[i] = c[i - 1] * a[i - 1]; //遍历求C值 } for(int j = len - 2; j >= 0; j--) { d[j] = d[j + 1] * a[j + 1]; //遍历求D值 } for(int i = 0 ; i < len; i++) { b[i] = c[i] * d[i]; //遍历求B值 } return b; } };
----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
原文地址:https://www.cnblogs.com/wzw0625/p/12830946.html