剑指 Offer 66. 构建乘积数组

 

 

思路:动态规划

   对于数组B中元素B[i],它的值等于A数组中 i 左侧元素乘积,与 i 右侧元素乘积  的乘积

  画表可知:

B[1]= 1* A[2]* A[3]* A[4]
B[2]= A[1]* 1* A[3]* A[4]
B[3]= A[1]* A[2]* 1* A[4]
B[4]= A[1]* A[2]* A[3]* 1

  因此需要维护两个 dp 数组 left、right,left 记录 i 左侧元素乘积,right 记录 i 右侧元素乘积

  结果B[ i ] = left[ i ] * right [ i ]

代码:

  时间复杂度O(n),空间复杂度O(n)

class Solution {
    public int[] constructArr(int[] a) {
        if (a == null || a.length == 0)
            return a;
        int[] left = new int[a.length];
        int[] right = new int[a.length];
        int[] ans = new int[a.length];
        left[0] = 1;
        right[a.length-1] = 1;
        for (int i = 1; i < a.length; i++) {
            left[i] = left[i-1] * a[i-1];
        }
        for (int i = a.length-2; i >= 0; i--) {
            right[i] = right[i+1] * a[i+1];
            ans[i] = left[i] * right[i];
        }
        ans[a.length-1] = left[a.length-1];
        return ans;
    }
}
posted @ 2021-02-28 18:03  zjcfrancis  阅读(25)  评论(0编辑  收藏  举报