1. 题目描述

给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B[i]的值是数组A中除了下标i以外的元素的积, 即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]

提示:

所有元素乘积之和不会溢出32位整数 a.length <= 100000

来源:力扣(LeetCode)

2. 算法思路

乘积数组可以用一个表格表示:

A[0] A[1] ... A[n-2] A[n-1]
B[0] 1 A[1] ... A[n-2] A[n-1]
B[1] A[0] 1 ... A[n-2] A[n-1]
... ... ... ... A[n-2] A[n-1]
B[n-2] A[0] A[1] ... 1 A[n-1]
B[n-1] A[0] A[1] ... A[n-2] 1

其中B[i]的值是每一行的乘积。易见,我们只需分别从上三角自下而上、下三角自上而下循环乘A[i]即可。

class Solution {
public:
vector<int> constructArr(vector<int>& a) {
vector<int> b(a.size(), 1);
int prod = 1;
for (int i = 1; i < a.size(); i++) {
prod *= a[i - 1];
b[i] = prod;
}
prod = 1;
for (int i = a.size() - 2; i >= 0; i--) {
prod *= a[i + 1];
b[i] *= prod;
}
return b;
}
};

算法效率

  • 时间复杂度:
  • 空间复杂度: