算法:构建乘积数组
构建乘积数组
构建乘积数组
给定一个数组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]中的一部分,然后倒过来按上三角中的分布规律,把另一部分也乘进去。
代码
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; } }
|