package leetcode;
public class offer_66 {
public int[] constructArr(int[] a) {
if(a==null||a.length==0) {return a;}
//两个动态规划数组,存储当前位置连续连续积
int[] dp1=new int[a.length];
int[] dp2=new int[a.length];
int[] b=new int[a.length];
dp1[0]=a[0];
dp2[a.length-1]=a[a.length-1];
for(int i=1;i<a.length;i++) {
//记录从左往右的数组
dp1[i]=dp1[i-1]*a[i];
//记录从右往左的数组
dp2[a.length-1-i]=dp2[a.length-i]*a[a.length-1-i];
}
b[0]=dp2[1];
b[b.length-1]=dp1[dp1.length-2];
//当前B[i]=左边的连续积与右边连续积的积
for (int i = 1; i < b.length-1; i++) {
b[i]=dp1[i-1]*dp2[i+1];
}
for (int i : b) {
System.out.println(i);
}
return b;
}
//简便方法
public int[] constructArr(int[] a) {
int[] res = new int[a.length];
for (int i = 0, cur = 1; i < a.length; i++) {
res[i] = cur; // 先乘左边的数(不包括自己)
cur *= a[i];
}
for (int i = a.length - 1, cur = 1; i >= 0; i--) {
res[i] *= cur; // 再乘右边的数(不包括自己)
cur *= a[i];
}
return res;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
offer_66 off=new offer_66();
int[] a= {1,2,3,4,5};
off.constructArr(a);
}
}