算法学习之构建乘积数组

题目描述

给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。

思路:嵌套循环这里就不考虑了,因为时间复杂度n^2,这里有另一种复杂度为n的方法。

把第i个数看成是左右两半的成绩,这里偷了张图,方便大家理解(哈哈,自己懒得画了)

根据图我们来写代码就行了

1、左边B[i] = tem[i-1]*A[i-1],其中tem为上一个数字的所得乘机

2、右边B[i] = tem[i+1]*A[i+1],其中tem与1中类似,为上一个数字的所得乘机

代码具体执行:我们首先从0遍历到n-1,来计算每一位的左半边乘机->在从n-1遍历到0并且乘上左半边就得到了我们想要的结果

import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] A) { 
       if(A==null||A.length<=0)return null;
       int [] B = new int[A.length];
       // 先计算左边
       B[0] = 1;
       for(int i = 1;i<A.length;i++){
           B[i] = B[i-1]*A[i-1];
       } 
        // 在计算依次乘右边
        int tem = 1;
        for(int i = A.length-2;i>=0;i--){
             B[i] *= (tem *= A[i+1]);
        }
        return B;
    }
}

时间复杂度:O(n)

空间复杂度:O(1)

练习地址:https://www.nowcoder.com/practice/94a4d381a68b47b7a8bed86f2975db46

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值