剑指 Offer 66. 构建乘积数组

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);
    }

}

 

posted on 2022-03-24 10:48  一仟零一夜丶  阅读(22)  评论(0)    收藏  举报