1 题目描述
2 算法思路
思路:
- 如果是直接乘,复杂度是O(n²),因此需要用一个更好的方法
- 这里就使用乘积数组。
- 正向遍历
- 在正向遍历时,让B[i] 等于 A[0] 一直乘到 A[i - 1]
- 也就是 B[i] = B[i - 1] * A[i - 1]
- 反向遍历
- 最后一个元素不用乘自己本身
- 因此B[i - 1] *= A[a.length] 一直到乘到 A[i]
3 代码
class Solution {
public int[] constructArr(int[] a) {
if(a.length == 0)
return new int[0];
int[] b = new int[a.length];
b[0] = 1;
int temp = 1;
for(int i = 1; i < a.length; i++){ //进行下半部的计算
b[i] = b[i - 1] * a[i - 1]; //次数b[i - 1]就是前i-2个数的乘积,再乘上上一个数
}
for(int i = a.length - 2; i >= 0; i--){ //进行上半步的计算,从倒数第二个开始i = a.length - 2
temp *= a[i + 1]; //计算a[i + 1] 到a[a.length - 1]的乘积
b[i] *= temp; //乘进结果中,完成后半部的计算
}
return b;
}
}