构建乘积数组

Posted ohana!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建乘积数组相关的知识,希望对你有一定的参考价值。

题目要求:

分析:

  • 不让用除法,就排除了先将所有的元素相乘,在按位相除
  • 不用除法,暴力的解法很容易就会超时,事实上,最后一个用例就是用来检验我们所写算法的时间复杂度的
  • 因此参考大佬的解法,可以使用上三角和下三角的方式
  • 仔细想想,暴力解法的根本原因就是计算重复,在上下三角的运算中,完美的避免了重复计算
  1. 在下三角的计算过程中,i(当前元素)array[i]= 前一个元素 * 原数组当中当前元素的前一个元素
  2. 在计算上三角时,巧妙地利用i的前后性,将未计算进去的后半部分计算进去

解题代码:

class Solution 
    public int[] constructArr(int[] a) 
        //如果数组a的长度为0,直接返回
        if(a.length == 0)
            return new int[0];
        
        //定义待返回的数组
        int[] array = new int[a.length];
        //主要思想还是和评论区大佬的思路一样,借助于上三角和下三角

        //令上三角的第一个元素也就是array[0]为1,后面也是为了降低时间复杂度
        array[0] = 1;
        for(int i = 1;i < array.length;i++)
            //从做的运算上来看,也是成功的慢了i一步,因此完成了除去i之外前半部分的乘法操作
            //这也是下三角的运算思路,属于是一个半成品
            array[i] = array[i - 1] * a[i - 1];
        

        //这是上三角的操作,是为了,完成剩下的一部分,可以理解为,除i之外后半部分的乘法操作
        int right = 1;
        for(int i = array.length - 2;i >= 0;i--)
            right *= a[i + 1];
            //将后半部分的乘积合并到前半部分,由于前半部分没有让i对应的元素参与运算
            //后半部分的乘积也自然不包含i所对应的元素
            array[i] *= right;
        

        return array;
    

以上是关于构建乘积数组的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 66. 构建乘积数组

剑指offer(二十九)之构建乘积数组

剑指offer-构建乘积数组

构建乘积数组(python)

剑指offer五十一之构建乘积数组

剑指offer系列——51.构建乘积数组