文章524
标签277
分类67

算法:构建乘积数组


构建乘积数组

构建乘积数组

给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]xA[1]x…xA[i-1]xA[i+1]x…xA[n-1]。

不能使用除法。

(注意:规定B[0] = A[1] x A[2] x … x A[n-1],B[n-1] = A[0] x A[1] x … x A[n-2];)


分析

剑指的思路:

B[i]的值可以看作下图的矩阵中每行的乘积。

下三角用连乘可以很容求得,上三角,从下向上也是连乘。

因此我们的思路就很清晰了,先算下三角中的连乘,即我们先算出B[i]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。

img


代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] arr) {
if (arr == null) return new int[0];
int len = arr.length;
if (len <= 1) return new int[1];

int[] res = new int[len];
// 计算下三角
res[0] = 1;
for (int i = 1; i < len; ++i) {
res[i] = res[i - 1] * arr[i - 1];
}
// 计算上三角
int temp = 1;
for (int i = len - 2; i >= 0; --i) {
temp *= arr[i + 1];
res[i] *= temp;
}
return res;
}
}

本文作者:Jasonkay
本文链接:https://jasonkayzk.github.io/cn/1996/07/27/%E7%AE%97%E6%B3%95-%E6%9E%84%E5%BB%BA%E4%B9%98%E7%A7%AF%E6%95%B0%E7%BB%84/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可