截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:​​https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ​提取码:6666

剑指 Offer-构建乘积数组_构建乘积数组
剑指 Offer-构建乘积数组_数据结构_02
代码如下

public int[] constructArr(int[] a) {
//边界条件判断
if (a == null || a.length == 0)
return a;
int length = a.length;
//每个元素左边所有元素的乘积
int[] resLeft = new int[length];
//每个元素右边所有元素的乘积
int[] resRight = new int[length];
//两个默认值
resLeft[0] = 1;
resRight[length - 1] = 1;

//当前元素左边的所有元素乘积(不包含当前元素)
for (int i = 1; i < length; i++) {
resLeft[i] = resLeft[i - 1] * a[i - 1];
}
//当前元素右边的所有元素乘积(不包含当前元素)
for (int i = length - 2; i >= 0; i--) {
resRight[i] = resRight[i + 1] * a[i + 1];
}
//左边乘以右边就是我们要求的结果
int[] res = new int[length];
for (int i = 0; i < length; i++) {
res[i] = resLeft[i] * resRight[i];
}
return res;
}

剑指 Offer-构建乘积数组_数据结构_03

public int[] constructArr(int[] a) {
//边界条件的判断
if (a == null || a.length == 0)
return a;
int length = a.length;
int[] res = new int[length];
res[0] = 1;
//当前元素左边的所有元素乘积(不包含当前元素)
for (int i = 1; i < length; i++) {
res[i] = res[i - 1] * a[i - 1];
}
int right = 1;
//right表示当前元素右边所有元素的乘积(不包含当前元素),
//res[i]表示的是左边的乘积,他俩相乘就是
//除了自己以外数组的乘积
for (int i = length - 1; i >= 0; i--) {
res[i] *= right;
right *= a[i];
}
return res;
}