本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目

  给定一个数组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]。不能使用除法。

思路

  无法使用除法,正常连乘的话时间复杂度为O(n^2),效率非常低。

  考虑到计算每个B[i]时都会有重复,思考B[i]之间的联系,找出规律,提高效率。

图片转自构建乘积数组

  如上图所示,可以发现:

    B[i]的左半部分(红色部分)和B[i-1]有关(将B[i]的左半部分乘积看成C[i],有C[i]=C[i-1]*A[i-1]),

    B[i]的右半部分(紫色部分)与B[i+1]有关(将B[i]的右半部分乘积看成D[i],有D[i]=D[i+1]*A[i+1]),

  因此我们先从0到n-1遍历,计算每个B[i]的左半部分;  然后定义一个变量temp代表右半部分的乘积,从n-1到0遍历,令B[i]*=temp,而每次的temp与上次的temp关系即为temp*=A[i+1]。

 测试代码

  1.功能测试(正、负、零)

  2.边界值测试(数组长度为2)

  3.特殊测试(null,数组长度为1,0)

Java代码

//题目:给定一个数组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]。不能使用除法。 public class ConstuctArray {
public int[] multiply(int[] A) {
if(A==null || A.length<2)
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 temp=1;
for(int i=A.length-2;i>=0;i--){
temp*=A[i+1];
B[i]*=temp;
}
return B;
}
}

  

收获

  1.考虑到了数组B中的元素间有关系,要进一步分析。本题就是采用画图的方法,将B看成一个矩阵,就能轻易地看出元素之间的关系了。好好学习。

  2.可以直接从头到尾再从尾到头遍历,不需要创建两个临时数组C[]和D[]。自己写代码时,要尽量设计不用创建太多内存空间。

  3.如果这道题可以用除法的话,记得除数不能为零!

 

更多:《剑指Offer》Java实现合集  

【Java】 剑指offer(66) 构建乘积数组的更多相关文章

  1. 剑指 Offer 66. 构建乘积数组 + 思维

    剑指 Offer 66. 构建乘积数组 Offer_66 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGarre ...

  2. 剑指offer 66. 构建乘积数组(Leetcode 238. Product of Array Except Self)

    剑指offer 66. 构建乘积数组 题目: 给定一个数组A[0, 1, ..., n-1],请构建一个数组B[0, 1, ..., n-1],其中B中的元素B[i] = A[0] * A[1] * ...

  3. 力扣 - 剑指 Offer 66. 构建乘积数组

    题目 剑指 Offer 66. 构建乘积数组 思路1 按照一般的思路就是将所有的相乘,然后除以每一位数字就是答案,但是题目要求我们不能使用除法,因此我们会想到每次遍历到每个数字的时候,在遍历一遍数组, ...

  4. 【剑指Offer】构建乘积数组 解题报告(Python)

    [剑指Offer]构建乘积数组 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  5. Go语言实现:【剑指offer】构建乘积数组

    该题目来源于牛客网<剑指offer>专题. 给定一个数组A[0,1,-,n-1],请构建一个数组B[0,1,-,n-1],其中B中的元素B[i]=A[0] * A[1] * - * A[i ...

  6. 剑指Offer 51. 构建乘积数组 (数组)

    题目描述 给定一个数组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].不 ...

  7. [剑指Offer] 51.构建乘积数组

    题目描述 给定一个数组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].不 ...

  8. 【剑指offer】构建乘积数组(注意优化空间)

    给定一个数组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].不能使用除法 ...

  9. 【剑指offer】构建乘积数组

    题目描述 给定一个数组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].不 ...

随机推荐

  1. C# unicode 转中文

    //Unicode 转中文 private void button1_Click(object sender, EventArgs e) { string unicode = @"\U5fa ...

  2. js设置div透明度

    原生js设置透明度 为了兼容IE与其他浏览器对透明度的设置,我们需要对以上两种样式分别进行设置: 复制代码代码如下: var alpha = 30; //透明度值变量 var oDiv = docum ...

  3. luogu P4161 [SCOI2009]游戏

    传送门 我们发现整个大置换中,会由若干形如\((a_1\rightarrow a_2,a_2\rightarrow a_3,...a_{n-1}\rightarrow a_n,a_n\rightarr ...

  4. luogu P1268 树的重量

    一开始把这题想复杂了,,, 这里记\(di[i][j]\)表示\(i\)到\(j\)的距离 首先如果\(n=2\),答案显然为\(di[1][2]\) 如果\(n=3\) 懒得画图了盗图过来 那么3号 ...

  5. Python GUI工具Tkinter以及拖拉工具Page安装

    如果使用Tkinter作为Python GUI工具,我们需要安装Tkinter,这个使用conda或者pip即可: conda install -c anaconda tk 为了提高界面编写效率,可以 ...

  6. 上传程序Dictionary 字典 哈希--多读一写锁ReaderWriterLock

    //上传程序Dictionary 字典 哈希 /// <summary> /// 车辆控制信息哈斯表,Key是终端号,Value是车辆信息控制对象 /// </summary> ...

  7. 使用Idea初始化SpringMvc项目

    (1) (2) (3) (4) (5)感谢http://www.cnblogs.com/feiyujun/p/6537510.html (6)

  8. V4L2学习记录【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637600.html V4L2学习记录 这个还没有分析完,先在这放着,防止电脑坏掉丢了,以后再完善 V4L ...

  9. Linux 调优方案, 修改最大连接数(ulimit命令)【转】

    转自:http://blog.csdn.net/liangxiaozhang/article/details/8363435 Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源 ...

  10. jython获取was5.1的jvm监控参数

    perfName = AdminControl.completeObjectName ('type=Perf,process=server1,node=TSC,cell=TSC,*') perfONa ...