码迷,mamicode.com
首页 > 编程语言 > 详细

剑指offer:构建乘积数组

时间:2020-04-19 22:32:30      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:lock   部分   思路   技术   code   重复   alt   block   tip   

题意描述

给定一个数组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]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n-1] = A[0] * A[1] * ... * A[n-2];)

解题思路

通过题意可知:B[i] = A[0]累乘到A[n-1] / A[i],但是题意要求不能使用除法。

技术图片

一、双层循环

将每层的数组分为两部分,【0,i)与(i,len-1】,将两部分进行累乘计算。

但是每层都要重复计算大部分相同的值,唯一区别在于A【i】的不同。

    public int[] multiply(int[] A) {
            int[] B = new int[A.length];
            if (A == null || A.length == 0) return B;
            int len = A.length;
            for (int i = 0; i < len; i++) {
                B[i] = 1;
                for (int j = 0; j < i; j++) {
                    B[i] *= A[j];	//前部分累乘
                }
                for (int j = i + 1; j < len; j++) {
                    B[i] *= A[j];	//后部分累乘
                }
            }
            return B;
        }

二、巧解法

以对象线为分界线,将数组分成两部分:左下角与右上角。分别对下三角和上三角进行求解。

下三角:Bn=Bn-1 * An-1

上三角:从n-2向上计算。

    public int[] multiply(int[] A) {
            int[] B = new int[A.length];
            if(A==null||A.length==0){
                B[0]=1;
                //计算下三角
                for (int i = 1; i <A.length ; i++) {
                    B[i]=B[i-1]*A[i-1];
                }
                int temp=1;	//使用temp记录 A[i+1] * A[len-1] 免去每层计算的时间
                //计算上三角
                for (int i = A.length-2; i>=0; i--) {
                    temp=temp*A[i+1];
                    B[i]=B[i]*temp;
                }
            }
            return B;
        }

剑指offer:构建乘积数组

标签:lock   部分   思路   技术   code   重复   alt   block   tip   

原文地址:https://www.cnblogs.com/le-le/p/12733929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!