一、题目
给定一个数组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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)
对于A长度为1的情况,B无意义,故而无法构建,因此该情况不会存在。
二、分析及代码
1. 辅助乘积数组
(1)思路
可将 B 中的元素分解为 A[0] * A[1] * … * A[i-1] 和 A[i+1] * … * A[n-1] 的乘积,而对应不同 i 的 A[0] * A[1] * … * A[i-1] 及 A[i+1] * … * A[n-1] 具有明显规律性,可设计辅助乘积数组 C[i] 和 D[i] 在循环过程中存储对应值,再依次相乘,使时间复杂度降至 O(n)。
(2)代码
import java.util.ArrayList;
public class Solution {
public int[] multiply(int[] A) {
int [] B = new int[A.length];
int [] C = new int[A.length];
int [] D = new int[A.length];
C[0] = 1;
D[0] = 1;
for (int i = 1; i < A.length; i++) {
C[i] = C[i - 1] * A[i - 1];
D[i] = D[i - 1] * A[A.length - i];
}
for (int i = 0; i < A.length; i++) {
B[i] = C[i] * D[A.length - i - 1];
}
return B;
}
}
(3)结果
运行时间:18 ms,占用内存:9320 k。
三、其他
暂无。