【剑指offer】65.构建乘积数组

总目录:

算法之旅导航目录

 

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](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。
(注意:规定 B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2])
对于 A 长度为 1 的情况,B 无意义,故而无法构建,用例中不包括这种情况。

数据范围:1≤n≤10  ,数组中元素满足 ∣val∣≤10

 

2.问题分析

 一个乘积可以由较小的乘积叠加而来,也可以由较大的乘积作除的来,本题禁止使用除法,只能通过小乘积累乘得到。

 1 class Solution {
 2   public:
 3     vector<int> multiply(const vector<int>& A) {
 4         vector<int> ret(A.size(), 1);
 5         //从左到右
 6         for (int i = 1; i < A.size(); i++) {
 7             ret[i] = ret[i - 1] * A[i - 1];
 8         }
 9 
10         //从右到左
11         int temp = 1;
12         for (int i = A.size() - 1; i >= 0; i--) {
13             ret[i] *= temp;
14             temp *= A[i];
15         }
16 
17         return ret;
18     }
19 };

 

 

对于左侧的乘积集合,B[n]=B[n-1]*A[n-1],

对于右侧的乘积集合,C[n]=C[n+1]*A[n+1];

将B和C集合逐元素相乘即得到返回值。

 

双向遍历法:

如果为了节省空间可以不用保存B和C的中间值,通过2次遍历、逐步迭代完成计算。


3.代码实例

双向遍历

 

posted @ 2022-12-05 18:45  啊原来是这样呀  阅读(21)  评论(0)    收藏  举报