构建乘积数组
Posted ohana!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构建乘积数组相关的知识,希望对你有一定的参考价值。
题目要求:
分析:
- 不让用除法,就排除了先将所有的元素相乘,在按位相除
- 不用除法,暴力的解法很容易就会超时,事实上,最后一个用例就是用来检验我们所写算法的时间复杂度的
- 因此参考大佬的解法,可以使用上三角和下三角的方式
- 仔细想想,暴力解法的根本原因就是计算重复,在上下三角的运算中,完美的避免了重复计算
- 在下三角的计算过程中,i(当前元素)array[i]= 前一个元素 * 原数组当中当前元素的前一个元素
- 在计算上三角时,巧妙地利用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;
以上是关于构建乘积数组的主要内容,如果未能解决你的问题,请参考以下文章