首页 > 编程语言 > 详细

剑指 Offer 66. 构建乘积数组

时间:2021-02-28 21:53:47      阅读:22      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

思路:动态规划

   对于数组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;
    }
}

剑指 Offer 66. 构建乘积数组

原文:https://www.cnblogs.com/zccfrancis/p/14459906.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!