原题:点击此处
考点:DP
这里用了两个数组分别维护前缀和和后缀和。
时间复杂度:O(n)
空间复杂度:O(n)
可以对空间进行压缩,但是实在不好理解,因此还是选择了这种做法:
class Solution {
public int[] constructArr(int[] a) {
if(a.length == 0){
return new int[0];
}
if(a.length == 1){
return new int[]{a[0]};
}
int len = a.length;
int[] leftToRight = new int[len];
leftToRight[0] = a[0];
int[] rightToLeft = new int[len];
rightToLeft[len-1] = a[len-1];
for(int i = 1;i<len;i++){
leftToRight[i] = leftToRight[i-1] * a[i];
}
for(int i = len-2; i>= 0;i--){
rightToLeft[i] = rightToLeft[i+1] * a[i];
}
int[] b = new int[len];
b[0] = rightToLeft[1];
b[len-1] = leftToRight[len-2];
for(int i = 1;i<len-1;i++){
b[i] = leftToRight[i-1] * rightToLeft[i+1];
}
return b;
}
}