剑指 Offer 66. 构建乘积数组
解题思路
- 1、计算每个元素左边所有元素的乘积,结果记录在left数组中,注意left[0] = 1,因为第一个位置左边没有元素;
- 2、计算每个元素右边所有元素的乘积,结果记录在res数组中,同理res[a.length-1] = 1;
- 3、最终,每个位置除当前元素外,其它元素的乘积 = left[i] * res[i]
注意:res是最终的结果,为了节省空间,先用res记录右边元素的乘积
代码
class Solution {
public int[] constructArr(int[] a) {
if (a == null || a.length == 0) {
return new int[0];
}
int[] left = new int[a.length];
left[0] = 1;
for (int l = 1; l < a.length; l++) {
left[l] = left[l - 1] * a[l - 1];
}
int[] res = new int[a.length];
res[a.length - 1] = 1;
for (int r = a.length - 2; r >= 0; r--) {
res[r] = res[r + 1] * a[r + 1];
}
for (int i = 0; i < a.length; i++) {
res[i] = left[i] * res[i];
}
return res;
}
}